首页 > 解决方案 > 当不过滤右侧时,T-SQL 从左连接的右侧删除空值

问题描述

我在 SQL 中遇到了一些我真的不明白的东西,也想有一个解决方案。如果我不在联接子句中过滤查询的右侧,为什么会从查询中过滤掉空值?

DECLARE @Categories table (CategoryID int, CategoryType varchar(30))
INSERT @Categories VALUES (1, 'T15')
INSERT @Categories VALUES (2, 'T15')
INSERT @Categories VALUES (3, 'T15')

DECLARE @SubCategories table (SubCategoryID int, CategoryID int, SubCategoryType varchar(30))
INSERT @SubCategories VALUES (1, 1, 'AAA A')
INSERT @SubCategories VALUES (2, 1, 'AAA B')
INSERT @SubCategories VALUES (3, 1, 'AAA C')
INSERT @SubCategories VALUES (4, 2, 'BBB A')
INSERT @SubCategories VALUES (5, 1, 'BBB A')
INSERT @SubCategories VALUES (6, 1, 'BBB B')
INSERT @SubCategories VALUES (7, 1, 'BBB C')
INSERT @SubCategories VALUES (14, 3, 'AAA B')
INSERT @SubCategories VALUES (15, 3, 'AAA C')
INSERT @SubCategories VALUES (16, 3, 'AAA A')

SELECT c.CategoryID, sc.SubCategoryType
FROM @Categories c
LEFT JOIN @SubCategories sc ON c.CategoryID = sc.CategoryID AND SubCategoryType = 'AAA A'

SELECT c.CategoryID, sc.SubCategoryType
FROM @Categories c
LEFT JOIN @SubCategories sc ON c.CategoryID = sc.CategoryID
CategoryID  SubCategoryType
----------- ------------------------------
1           AAA A
2           NULL                          This one is MIA from the other result set
3           AAA A

CategoryID  SubCategoryType
----------- ------------------------------
1           AAA A
1           AAA B
1           AAA C
1           BBB A
1           BBB B
1           BBB C
2           BBB A
3           AAA B
3           AAA C
3           AAA A

我希望在第二个查询中看到第一个查询的第二行,但它不存在。为什么,我怎样才能得到它?

标签: sqlsql-server

解决方案


NULLs 没有被“过滤掉” 。

两个表之间的值匹配。这就是第二个查询告诉您的内容。然而,比赛正在进行中'BBB A'。上没有匹配项'AAA A'

您的第一个查询反映了这一点。它是说“只考虑匹配'AAA A'”。因为没有这样的匹配,查询返回NULL该行。


推荐阅读