我想知道完全加入 in MySQL的替代方案。我知道这可以通过工会来完成,但它没有起作用,因为我的要求有点复杂,我希望如此。我有两个表主表(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()
我需要branch_id的sum(billvalue) sum(travalue)组的结果,
发布于 2013-09-08 00:43:39
因为每个branch_id
的两个表都不止一行,所以需要首先在每个表中分别使用GROUP BY branch_id
,然后使用UNION ALL
和多一个GROUP BY
来模拟FULL JOIN
,或者使用两个子查询(一个带有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的答案中提供的。首先执行一个UNION
(而不是UNION ALL
)来查找来自两个表的所有不同的branch_id
,然后在已经分别执行GROUP BY branch_id
的派生表中执行2个LEFT
连接。
https://stackoverflow.com/questions/18681387
复制相似问题