sql - 当不过滤右侧时,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
我希望在第二个查询中看到第一个查询的第二行,但它不存在。为什么,我怎样才能得到它?
解决方案
NULL
s 没有被“过滤掉” 。
两个表之间的值匹配。这就是第二个查询告诉您的内容。然而,比赛正在进行中'BBB A'
。上没有匹配项'AAA A'
。
您的第一个查询反映了这一点。它是说“只考虑匹配'AAA A'
”。因为没有这样的匹配,查询返回NULL
该行。
推荐阅读
- python - 当 List1 == List2 时,将 List3 中的条目与 List1 中的索引相加
- amazon-ec2 - 无法登录 EC2 实例
- java - Spring Data,Hibernate - 一对多关系不会为孩子们持续存在
- maven - maven-war-plugin 版本导致OOM
- css - 单击按钮时CSS过渡不起作用
- c++ - 对象集的排序不正确
- wpf - ContextMenu 绑定菜单项标题 MVVM
- asp.net - Autofac 在类库中解析
- oop - 实例变量 super 不能从另一个实例变量的定义中访问
- javascript - 隐藏中心时保持开始和结束的子字符串函数