使用WHERE EXISTS从两表获取多列时的NULL值问题(SQL Server)
SQL Server中EXISTS查询成绩字段返回NULL的解决方法
我需要对比SQL Server中两个表的姓名列,输出TABLE_1_Today's_List中**存在/不存在于TABLE_2_Combined_Scores(且Grade=10)**的学生及其对应成绩,但当前使用WHERE EXISTS的查询语句中,所有成绩字段均返回NULL值。
表结构
TABLE_1_Today's_List
| Name1 |
|---|
| Kevin |
| James |
| Roger |
| Bob |
TABLE_2_Combined_Scores
| Name2 | Grade | Score_1 | Score_2 | Score_3 | Score_4 |
|---|---|---|---|---|---|
| Kevin | 10 | 25 | 34 | 12 | 45 |
| Bob | 9 | 25 | 23 | 65 | 87 |
| Roger | 10 | 43 | 54 | 25 | 98 |
| James | 12 | 43 | 54 | 25 | 98 |
现有错误查询脚本
查询同时存在于两表且Grade=10的学生
SELECT c.Name1, Score_1,Score_2,Score_3,Score_4 FROM TABLE_1_Today's_List c WHERE EXISTS (SELECT c2.Name2,Score_1,Score_2,Score_3,Score_4 FROM TABLE_2_Combined_Scores c2 WHERE c2.Name2 = c.Name1 and Grade = '10');
问题:能正确匹配学生,但
Score_1至Score_4均返回NULL。
查询仅存在于表1(TABLE_2中无对应Name且Grade=10)的学生
SELECT c.Name1, Score_1,Score_2,Score_3,Score_4 FROM TABLE_1_Today's_List c WHERE NOT EXISTS (SELECT c2.Name2,Score_1,Score_2,Score_3,Score_4 FROM TABLE_2_Combined_Scores c2 WHERE c2.Name2 = c.Name1 and Grade = '10');
问题:能正确匹配学生,但成绩字段均返回NULL。
问题原因
成绩字段Score_1至Score_4仅存在于TABLE_2_Combined_Scores中,现有查询仅从TABLE_1_Today's_List选取数据,未关联TABLE_2获取成绩,因此返回NULL。WHERE EXISTS仅用于判断存在性,不会自动关联表字段。
解决方案
1. 查询同时存在于两表且Grade=10的学生及成绩
使用INNER JOIN关联两表,直接从TABLE_2获取成绩:
SELECT c.Name1, c2.Score_1, c2.Score_2, c2.Score_3, c2.Score_4 FROM TABLE_1_Today's_List c INNER JOIN TABLE_2_Combined_Scores c2 ON c.Name1 = c2.Name2 WHERE c2.Grade = '10';
执行结果(符合期望输出):
| Name1 | Score_1 | Score_2 | Score_3 | Score_4 |
|---|---|---|---|---|
| Kevin | 25 | 34 | 12 | 45 |
| Roger | 43 | 54 | 25 | 98 |
2. 查询仅存在于表1(TABLE_2中无对应Name且Grade=10)的学生及成绩
使用LEFT JOIN关联,筛选TABLE_2中无匹配记录的行,成绩字段会自然返回NULL(符合需求):
SELECT c.Name1, c2.Score_1, c2.Score_2, c2.Score_3, c2.Score_4 FROM TABLE_1_Today's_List c LEFT JOIN TABLE_2_Combined_Scores c2 ON c.Name1 = c2.Name2 AND c2.Grade = '10' WHERE c2.Name2 IS NULL;
执行结果:
| Name1 | Score_1 | Score_2 | Score_3 | Score_4 |
|---|---|---|---|---|
| James | NULL | NULL | NULL | NULL |
| Bob | NULL | NULL | NULL | NULL |
内容的提问来源于stack exchange,提问作者investcorobot0192821
相关产品推荐
相关产品推荐

