繁体   English   中英

与GROUP BY的LEFT JOIN返回意外结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM