我想知道MySQL中 Full Outer Join 的替代方案。我知道这可以通过工会来完成,但它不起作用,因为我的要求有点复杂,我希望如此。我有两个表master(branch_id,purchase_mindate,purchase_billvalue)和transfer(branch_id,tra_gtr_date,tra_travalue),其中两个id字段几乎相同。现在我需要通过连接具有条件的两个表来获取值 id,sum(billvalue),sum(travalue)
我尝试过工会,加入等等,但没有任何帮助我知道我在某处做错了什么,但我无法确定请帮助我。
我使用了以下查询,
select purchase_master.branch_id, sum(purchase_billvalue) as billvalue, sum(tra_value) as travalue
from purchase_master
join purchase_transfer on purchase_master.branch_id=purchase_transfer.branch_id
where purchase_mindate=CURDATE() and tra_gtr_date=CURDATE()
group by branch_id
只有当两个表包含当前日期但我没有得到任何值(如果一个表有,而其他表没有)时,我得到值
我附上了桌子的屏幕截图。
主表
转移表
我尝试了以下查询,但结果为空,
select pm.branch_id,pm.purchase_billvalue, pt.tra_value from purchase_master as pm
left outer join purchase_transfer as pt on pm.branch_id=pt.branch_id
where pm.purchase_mindate=CURDATE() and pt.tra_gtr_date=CURDATE()
union
select pm.branch_id,pm.purchase_billvalue, pt.tra_value from purchase_master as pm
right outer join purchase_transfer as pt on pm.branch_id = pt.branch_id
where pm.purchase_mindate=CURDATE() and pt.tra_gtr_date=CURDATE()
我需要结果作为sum(billvalue)sum(travalue)group by branch_id,
答案 0 :(得分:3)
由于每个表格每branch_id
个符合一行,因此您需要先在每个表格中GROUP BY branch_id
- 然后使用FULL JOIN
模拟UNION ALL
,还有一个GROUP BY
或两个子查询,一个包含LEFT
,另一个包含RIGHT
外连接。
第一个(GROUP BY
分开,然后UNION ALL
加GROUP BY
)方式:
SELECT branch_id,
SUM(purchase_billvalue) AS purchase_billvalue,
SUM(tra_value) AS tra_value
FROM
( SELECT branch_id,
SUM(purchase_billvalue) AS purchase_billvalue,
NULL AS tra_value
FROM purchase_master
WHERE purchase_mindate = CURDATE()
GROUP BY branch_id
UNION ALL
SELECT branch_id,
NULL,
SUM(tra_value)
FROM purchase_transfer
WHERE tra_gtr_date = CURDATE()
GROUP BY branch_id
) AS u
GROUP BY branch_id ;
@peterm's answer 中提供了第三种方法 - 这可能是最有效的方法(但要测试!)。首先执行UNION
(不是UNION ALL
)从两个表中查找所有不同的branch_id
,然后将2 LEFT
个连接到已执行{{1分开。
答案 1 :(得分:2)
你可以做这样的事情
SELECT i.branch_id,
m.purchase_billvalue billvalue,
t.tra_travalue travalue
FROM
(
SELECT branch_id
FROM master
WHERE purchase_mindate = CURDATE()
UNION
SELECT branch_id
FROM transfer
WHERE tra_gtr_date = CURDATE()
) i LEFT JOIN
(
SELECT branch_id, SUM(purchase_billvalue) purchase_billvalue
FROM master
WHERE purchase_mindate = CURDATE()
GROUP BY branch_id
) m
ON i.branch_id = m.branch_id LEFT JOIN
(
SELECT branch_id, SUM(tra_travalue) tra_travalue
FROM transfer
WHERE tra_gtr_date = CURDATE()
GROUP BY branch_id
) t
ON i.branch_id = t.branch_id
示例输出(基于您的屏幕截图并假设两个表中所有显示行的日期值相等):
| BRANCH_ID | BILLVALUE | TRAVALUE | |-----------|-----------|----------| | 2 | 72580.61 | 119947 | | 3 | (null) | 9940 |
这是 SQLFiddle 演示