模拟完全连接返回错误值
Posted
技术标签:
【中文标题】模拟完全连接返回错误值【英文标题】:emulated of full join return wrong values 【发布时间】:2016-12-29 10:12:53 【问题描述】:我有两个没有关系的表,我做了一个左右连接来模拟它们的完全连接并选择一些数据。 显示数据的方式是对的,但值是错误的,看起来他们选择了不止一次。 我的桌子是这样的: 表 1(便宜货) trade_date ---- 利润
表 2(general_cost) 日期-----费用
这是我写的查询:
select b.trade_date, coalesce(sum(b.profit),0), coalesce(sum(g.cost),0)
from bargains as b
left join general_cost as g on b.trade_date = g.date group by b.trade_date
union
select g.date, coalesce(sum(b.profit),0), coalesce(sum(g.cost),0) from
bargains as b
right join general_cost as g on b.trade_date = g.date group by g.date
这是查询的结果:
例如,在日期 1395-9-28 中,利润列的总和应为 440,成本列的总和应为 800 如果对您有帮助,您应该知道这个日期在便宜货表中有三行,而在 general_cost 表中有两行
【问题讨论】:
【参考方案1】:是的,您的查询重复了匹配的记录,因为它们同时包含在左连接和右连接中。您需要从其中一个查询中排除匹配的记录。我通常将它们从联合的第二个查询中排除:
select b.trade_date, coalesce(sum(b.profit),0), coalesce(sum(g.cost),0)
from bargains as b
left join general_cost as g on b.trade_date = g.date group by b.trade_date
union
select g.date, coalesce(sum(b.profit),0), coalesce(sum(g.cost),0) from
bargains as b
right join general_cost as g on b.trade_date = g.date
where b.date is null //include only the records from general_cost that are not matched
group by g.date
更新
如果两个表中有多个相同日期的记录,则需要在子查询中分别对每个表进行求和,否则匹配的记录会重复:
select b.trade_date, b.profit, coalesce(g.cost,0)
from (select trade_date, sum(profit) as profit from bargains group by trade_date) as b
left join (select date, sum(cost) as cost from general_cost group by date) as g on b.trade_date = g.date
union
select g.date, 0, sum(g.cost) from //all profits has been summed up in the above query, so here we can use 0 in place of profit
bargains as b
right join general_cost as g on b.trade_date = g.date
where b.trade_date is null //include only the records from general_cost that are not matched
group by g.date
【讨论】:
我使用 where 子句,但查询返回的行数为 9,我的意思是它得到的更少,但我仍然在该日期收到相同的结果,这意味着两个表仍然存在匹配。你认为问题是因为我使用分组吗? 啊,where
放错地方了,需要抢先一步。答案已更新。
我知道我做得对,我更改了 where 子句,但结果仍然如我所说。当我从查询中删除总和时,我可以向您发送查询结果吗,因为正如您所说,它应该排除空值但没有空值,例如成本列中每个日期的三个相同值的副本利润专栏我现在该怎么办
更新了答案
非常感谢它可以按我的意愿正常工作,只是我想知道是否可以按 month() 和 year() 命令对结果进行分组,这样我们就有了成本和利润每月而不是每天。以上是关于模拟完全连接返回错误值的主要内容,如果未能解决你的问题,请参考以下文章
inner join(内连接)left join(左连接)right join(右连接)full join(全连接)区别