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 不会得到正确的结果。
我正在尝试 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 不会得到正确的结果。