2013-03-22 98 views
-4

我需要一個完整的外部加入mysql。我在這裏找到了一個解決方案:Full Outer Join in MySQL我的問題是t1和t2本身就是子查詢。所得到的查詢看起來像一個怪物。 在這種情況下該怎麼辦?我應該使用視圖而不是子查詢嗎?完全外部加入怎麼辦

編輯: 我會盡量多解釋一下。我有訂單和付款。一次付款可能會減少多個訂單,一次訂單可能會因多次付款而受到影響。這就是爲什麼我有表格訂單,付款和付款方式。每個訂單都有現場公司(製作此訂單)和經理(接受此訂單)。現在我需要由公司和經理對訂單和付款進行分組並計數。所以,我想是這樣的:

company1 | managerA | 200 | 200 | 0 
company1 | managerB | Null | 100 | 100 
company1 | managerC | 300 | Null | -300 
company2 | managerA | 150 | Null | -150 
company2 | managerB | 100 | 350 | 250 

查詢,我設法創造:

SELECT coalesce(o.o_company, p.o_company) 
    , coalesce(o.o_manager, p.o_manager) 
    , o.orderstotal 
    , p.paymentstotal 
    , (coalesce(p.paymentstotal, 0) - coalesce(o.orderstotal, 0)) AS balance 
FROM 
     (((/*Subquery A*/SELECT orders.o_company 
       , orders.o_manager 
       , sum(o_money) AS orderstotal 
      FROM 
       orders 
      WHERE 
       (o_date >= @startdate) 
       AND (o_date <= @enddate) 
      GROUP BY 
       o_company 
      , o_manager) AS o 
LEFT JOIN (/*Subquery B*/SELECT orders.o_company 
       , orders.o_manager 
       , sum(paymentitems.p_money) AS paymentstotal 
      FROM 
      ((payments 
      INNER JOIN paymentitems 
      ON payments.p_id = paymentitems.p_id) 
      INNER JOIN orders 
      ON paymentitems.p_oid = orders.o_id) 
      WHERE 
      (payments.p_date >= @startdate) 
      AND (payments.p_date <= @enddate) 
      GROUP BY 
      orders.o_company 
      , orders.o_manager) AS p 
    ON (o.o_company = p.o_company) and (o.o_manager = p.o_manager)) 
    union 
      (/*Subquery A*/ 
right join /*Subquery B*/ 
    ON (o.o_company = p.o_company) and (o.o_manager = p.o_manager))) 

這是簡化我的查詢版本。真正的查詢要複雜得多,這就是爲什麼我想盡可能保持簡單。甚至可能分裂成意見,或者可能有其他選項我不知道。

+0

您的結果查詢是否必須參加SQL查詢選美比賽?如果不是,爲什麼要打擾看起來?檢查其性能,應用必要的索引等。 – raina77ow 2013-03-22 15:09:09

+0

您可能想向我們顯示您的查詢。 – Kermit 2013-03-22 15:09:23

+0

@ raina77ow術語「美」是指易於理解,編輯和調試的代碼。我目前的項目是長期項目,所以這個特點是可取的。 – Torbins 2013-03-22 19:06:33

回答

0

我認爲線索是在「組訂單和付款由公司」。將外連接分解爲對訂單的查詢和對付款的另一個查詢,然後爲每個公司添加資金類型(訂單或付款)。

+0

這正是我所做的。現在,所有分組邏輯都已移至客戶端並由OLAP組件FastCube處理。 – Torbins 2013-03-30 11:14:45

0

如果您嘗試完全外部連接之間的關係爲1-1,那麼您可以使用union和聚合完成相同的操作。

下面是一個例子,從兩個不同的表拉着一列:

select id, max(col1) as col1, max(col2) as col2 
from ((select t1.id, t1.col1, NULL as col2 
     from t1 
    ) union all 
     (select t23.id, NULL as col1, t2.col2 
     from t2 
    ) 
    ) t 
group by id 
+0

不,不幸的是,關係不是1-1。我已經爲我的問題製作了一些版本。 – Torbins 2013-03-22 19:09:47