LEFT JOIN 与 GROUP BY returns 意外结果

LEFT JOIN with GROUP BY returns unexpected result

我正在尝试 select st_annual table 中不存在的所有 feeheads 使用以下查询,但它只有 returns 一行而我希望得到两行:

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

请看fiddle。我希望得到 id=3 和 id=6,但我只得到 id=3.

我想 select st_annual table 中存在的所有不同的 feeid,我想与 hl_annual table 中的 id 进行比较.如果当我们按 regd 和 feeid 对 st_table 进行分组时 feeid 不存在,我想从 hl_annual table 中获取缺少的费用 id。因此,从 fiddle 中,我只得到 feeid 3,它不在 st_annual 中,但我也想得到 feeid=6,因为它不存在于 st_annual 中的一个 regd 中。

为什么要使用聚合?这是一个想法:使用 not exists。你的意图更明确,它应该有更好的性能(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
                 )  ;    

我不确定这是否解决了逻辑问题,但对于您所问的问题,这是一个更好的起点。

在做出大量假设后......

我们需要一份包含 class 和费用的主列表。所以首先我们从 ST_Annual table 中得到一个不同的列表,然后加入 HL_Annual;但由于这不包含每个 class 的 regD,我们必须交叉连接回来获取每个 class 的 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 相关的 table,regd 这将使这更容易,特别是 table 那是 [=31= 的关系] 到 regd,也许再次会话我正在做假设;对于每个条目。

因为我无法 SQL FIDDLE 去工作...去工作... http://rextester.com/SMG32021

奇怪的是 table 已经存在...具有相同的数据...

哦...输出:

    id  class   session feehead             amount  FeeID   regd
  1 3   4       2       Examination Fees    500     NULL    NULL
  2 6   4       2       Sports              1500    6       NULL

但我再次提醒您,我必须对涉及 class、regd 和会话的数据之间的关系做出几个假设,并且 id/feeid... 如果我的假设是错误的;那么这虽然 return 在这里得到了正确的结果,但如果数据不同,可能 return 不会得到正确的结果。