[英]LEFT JOIN with GROUP BY returns unexpected result
我正在尝试使用以下查询选择st_annual
表中不存在的所有feeheads
,但它只返回一行,而我希望得到两行:
SELECT A.*
FROM hl_annual A
LEFT JOIN (
SELECT feeid, regd, class
FROM st_annual
GROUP BY regd, feeid
) B ON A.id = B.feeid AND A.class=B.class
WHERE A.class='4' AND A.session='2'
AND B.feeid IS NULL
请看小提琴 。 我希望得到id = 3和id = 6,但我只有id = 3。
我想选择st_annual表中存在的所有唯一的Feeid,并与hl_annual表中的ID进行比较。 如果在按regd和Feeid分组st_table时不存在Feeid,我想从hl_annual表中获取该缺席的费用ID。 因此,从小提琴中,我仅获得非st_annual中的Feeid 3,但我也想获得Feeid = 6,因为这在st_annual中的regd中不存在。
为什么要使用使用聚合? 这是一个想法:使用not exists
。 更加明确地表明您的意图,并且应该具有更好的性能( st_annual(fee_id, class)
上的索引会st_annual(fee_id, class)
帮助):
SELECT A.*
FROM hl_annual A
WHERE A.class = 4 AND A.session = 2 AND
NOT EXISTS (SELECT 1
FROM st_annual sa
WHERE A.id = sa.feeid AND sa.class = B.class
) ;
我不确定这是否可以解决逻辑问题,但是对于您正在询问的问题,这是一个更好的起点。
经过大量的假设...
我们需要一个总的班级和费用清单。 因此,首先我们从ST_Annual表中获得一个独特的列表,然后再加入HL_Annual; 但是,由于其中不包含每个类的regD,因此我们必须交叉联接以获取每个类的regD。现在,我们有了主列表,然后将其联接回ST_Annual以查找缺少的列表。
SELECT A.*, B.FeeID, c.regd
FROM HL_ANNUAL A
LEFT JOIN (SELECT distinct Y.class, FeeID, Z.RegD
from ST_ANNUAL Y
cross join (Select Distinct regD, Class from st_Annual) Z
WHERE Y.Class = Z.Class
) B
on A.ID = B.FeeID
and A.Class = B.Class
LEFT JOIN ST_ANNUAL C
on C.FeeID = B.FeeID
and C.Class= B.Class
and C.RegD = B.RegD
WHERE A.class = 4
AND A.session = 2
AND C.RegD is null
Order by A.ID, A.Class
我忍不住感到我们缺少与class,regd相关的表,这将使此操作更容易,尤其是一个表,它是class与regd之间的关系,也许是我正在做的会话。 对于每个条目。
由于我无法使用SQL FIDDLE进行工作...因此无法正常工作... http://rextester.com/SMG32021
奇怪的是,表已经存在...具有相同的数据...
哦...,输出:
id class session feehead amount FeeID regd
1 3 4 2 Examination Fees 500 NULL NULL
2 6 4 2 Sports 1500 6 NULL
但是我再次提醒您,我必须对涉及类,regd和会话以及id / feeid的数据之间的关系做出一些假设...如果我的假设是错误的; 那么这会在此处返回正确结果时,如果数据变化,则可能不会返回正确结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.