我需要在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 :(得分:0)
如果您尝试进行完全外连接和,则关系为1-1,那么您可以使用union
和aggreagation完成相同的操作。
这是一个例子,从两个不同的表中拉出一列:
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
答案 1 :(得分:0)
我认为线索是“团体订单和公司付款”。将外部联接分解为订单查询和另一个付款查询,然后将每个公司的货币类型(订单或付款)加起来。