gpt4 book ai didi

SQL Left Join 过滤后丢失行

转载 作者:行者123 更新时间:2023-12-04 01:42:26 26 4
gpt4 key购买 nike

我有一个多表连接(示例中只显示了两个),我需要保留基表中的所有行。显然,我使用 LEFT JOIN 来包含基表上的所有行。没有 WHERE 子句它工作得很好——当右表中不存在一行时,左表中的行仍然显示,只是右表中的列是 0。数据集中的前两行是来自左表的标签和来自右表的行数,按标签分组。当标签没有分配来自 Table2 的值时,我想要的只是计数为 0。
表1

Label | FK
----------
Blue | 1
Red | 2
Green | 3
表2
Values | pk    | Date
---------------------------
Dog | 1 | 02/02/2010
Cat | 2 | 02/02/2010
Dog | 1 | 02/02/2010
Cat | 2 | 02/02/2010
查询 :
SELECT 1.Label, COUNT(2.values)
FROM Table1 1
LEFT JOIN Table2 2 ON 1.fk = 2.pk
GROUP BY 1.Label
良好的结果集 - 无过滤器
Blue  | 2
Red | 2
Green | 0
伟大的!
我的问题是,当我添加过滤条件以从右表中删除行时,左连接行的行被删除(将它们清零),左行被删除。即使它们的计数被过滤为零,我也需要保留左行。
SELECT 1.Label, COUNT(2.values)
FROM Table1 1
LEFT JOIN Table2 2 ON 1.fk = 1.pk
WHERE 2.Date BETWEEN '1/1/2010' AND '12/31/2010'
GROUP BY 1.Label
无赖结果集 - 过滤器后
Blue | 2
Red | 2
公爵们!
那么,什么鬼?我是否需要使用过滤后的数据集获取临时表然后将其连接到左表?我错过了什么?
谢谢!
进行第二次联接或递归联接。获取我的“好”连接表,获取第二个“过滤”表,然后左连接它们

最佳答案

您正在过滤 where 中的第二个表.值可能是 NULLNULL比较失败。
移动 where条件到 on条款:

SELECT 1.Label, COUNT(2.values)
FROM Table1 1 LEFT JOIN
Table2 2
ON 1.fk = 1.pk AND
2.Date BETWEEN 1/1/2010 AND 12/31/2010
GROUP BY 1.Label
笔记:
日期格式保留了问题中的日期。但是,我不提倡使用 BETWEEN对于日期和条件应使用标准日期格式:
SELECT 1.Label, COUNT(2.values)
FROM Table1 1 LEFT JOIN
Table2 2
ON 1.fk = 1.pk AND
2.Date >= '2010-01-01' AND
2.Date < '2011-01-01'
GROUP BY 1.Label;
一些数据库支持 SQL 标准关键字 DATE识别日期常量。

关于SQL Left Join 过滤后丢失行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18750464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com