SQL Server 2017多表查询:筛选无Intro课程的Record与Topic
解决未关联Intro课程的Record查询问题
针对你的需求,在SQL Server 2017中可以用两种高效的方式实现,避免结果冗余:
方法1:LEFT JOIN + 空值过滤
通过LEFT JOIN关联表并仅匹配Intro课程,再筛选未匹配到的记录,同时用DISTINCT避免重复行:
SELECT DISTINCT t1.Record, t1.Topic FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.Record = t2.Record AND t2.Course = 'Intro' -- 仅关联Intro课程的记录 WHERE t2.Record IS NULL; -- 筛选未匹配到Intro课程的行
说明
- 将
Course = 'Intro'放在JOIN条件中,确保LEFT JOIN保留Table1的所有行,仅标记出关联了Intro课程的记录 WHERE t2.Record IS NULL会过滤掉那些关联到Intro课程的行,剩下的就是未关联Intro的记录DISTINCT用于处理Table1本身存在重复记录,或Table2中同一Record有多个非Intro课程导致的结果冗余
方法2:NOT EXISTS子查询
利用NOT EXISTS检查当前Record是否不存在Intro课程的关联记录,这种方式性能优异且不会产生重复:
SELECT t1.Record, t1.Topic FROM Table1 t1 WHERE NOT EXISTS ( SELECT 1 -- 仅检查存在性,无需返回实际列 FROM Table2 t2 WHERE t2.Record = t1.Record AND t2.Course = 'Intro' );
说明
- 子查询仅验证是否存在匹配的Intro课程记录,SQL Server会对这种查询做优化,执行效率高
- 只要
Table1中没有重复的Record行,结果不会出现冗余
为什么之前结果冗余?
你之前的查询可能存在以下问题:
- 使用了
INNER JOIN,仅返回有课程关联的记录,而非所有Table1记录 - 将
Course <> 'Intro'放在WHERE条件中,导致同一Record关联多个非Intro课程时,结果重复 - 未添加去重逻辑(如
DISTINCT或GROUP BY),导致重复行出现
内容的提问来源于stack exchange,提问作者smul86
相关产品推荐
相关产品推荐

