mysqlで完全外部結合が必要です。ここで解決策を見つけました:MySQLの完全外部結合私の問題は、t1とt2自体がサブクエリであるということです。したがって、結果のクエリはモンスターのように見えます。この状況で何をしますか?サブクエリの代わりにビューを使用する必要がありますか?
編集: もう少し説明しようと思います。注文と支払いがあります。1回の支払いで複数の注文を処理でき、1回の支払いで複数の支払いを処理できます。そのため、テーブルの注文、支払い、および支払いアイテムがあります。各注文には、フィールド会社(この注文を行った)とマネージャー(この注文を受け入れた)があります。次に、会社とマネージャーごとに注文と支払いをグループ化し、お金を数える必要があります。だから私はこのようなものを手に入れたい:
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)))
これは私のクエリの簡略化されたバージョンです。実際のクエリははるかに複雑です。そのため、できるだけシンプルにしたいと思います。たぶん、ビューに分割することさえあるかもしれませんし、あるいは私が知らない他のオプションがあるかもしれません。