我需要一个完整的外部连接在 mysql 中。我在这里找到了一个解决方案: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)))
这是我的查询的简化版本。真正的查询要复杂得多,这就是为什么我想让它尽可能简单。甚至可能分成视图,或者可能还有其他我不知道的选项。