gpt4 book ai didi

SQL Left Join 过滤后丢失行

转载 作者:行者123 更新时间:2023-11-29 17:32:29 24 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 中的第二个表。这些值可能是 NULL,并且 NULL 比较失败。

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/50528016/

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