SQL Left在过滤后加入丢失的行

BCl*_*don 11 sql left-join

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

表格1

Label | FK
----------
Blue  | 1
Red   | 2
Green | 3
Run Code Online (Sandbox Code Playgroud)

表2

Values | Color | Date
---------------------------
Dog    | 1     | 02/02/2010
Cat    | 2     | 02/02/2010
Dog    | 1     | 02/02/2010
Cat    | 2     | 02/02/2010
Run Code Online (Sandbox Code Playgroud)

查询:

SELECT 1.Label, COUNT(2.values)
FROM Table1 1
    LEFT JOIN Table2 2 ON 1.fk = 1.pk
GROUP BY 1.Label
Run Code Online (Sandbox Code Playgroud)

结果集良好 - 没有过滤器

Blue  | 2
Red   | 2
Green | 0
Run Code Online (Sandbox Code Playgroud)

大!

我的问题是,当我添加过滤条件以从右表中删除行时,我的左连接行将其删除(将它们清零),删除左行.即使他们的计数被过滤到零,我也需要保留左行.

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
Run Code Online (Sandbox Code Playgroud)

更糟糕的结果集 - 过滤后

Blue | 2
Red  | 2
Run Code Online (Sandbox Code Playgroud)

公爵!

那么,到底是什么?我是否需要获取带有过滤数据集的临时表然后将其连接到左表?我错过了什么?谢谢!

进行第二次连接或递归连接.获取我的"好"连接表,获取第二个"过滤"表,然后LEFT JOIN它们

Gor*_*off 17

您正在过滤第二个表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
Run Code Online (Sandbox Code Playgroud)