我需要一個完整的外部加入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)))
這是簡化我的查詢版本。真正的查詢要複雜得多,這就是爲什麼我想盡可能保持簡單。甚至可能分裂成意見,或者可能有其他選項我不知道。
您的結果查詢是否必須參加SQL查詢選美比賽?如果不是,爲什麼要打擾看起來?檢查其性能,應用必要的索引等。 – raina77ow 2013-03-22 15:09:09
您可能想向我們顯示您的查詢。 – Kermit 2013-03-22 15:09:23
@ raina77ow術語「美」是指易於理解,編輯和調試的代碼。我目前的項目是長期項目,所以這個特點是可取的。 – Torbins 2013-03-22 19:06:33