为什么SQL关联子查询可正确筛选独著作者,普通子查询却返回全部作者
两条SQL结果差异的核心原因
两条语句的本质区别是子查询的类型不同,执行逻辑完全不一样:
关联子查询(第一条语句)
- 子查询和外层的authors表存在关联条件
a.au_id = ta.au_id,执行时会逐行遍历authors表的每一条作者记录:- 取当前作者的au_id值,代入子查询的筛选条件
- 只查询这个作者自己在title_authors表中的所有royalty_share值,判断集合中是否存在1
- 只有存在1(该作者有独著作品)时,才会保留这条作者记录
- 所以这条语句的筛选逻辑完全匹配需求,返回结果正确。
非关联子查询(第二条语句)
- 子查询没有和外层authors表的关联条件,会独立执行:
- 先直接取出title_authors表中所有记录的royalty_share值,生成一个全局集合
- 只要这个全局集合里存在至少一个1(测试表中显然存在独著作品,所以这个判断永远为真)
- 外层的where条件永远成立,最终会返回authors表的所有记录,完全没有按单个作者过滤,所以结果不符合预期。
替代写法参考
如果不想用关联子查询,也可以用联表去重的写法实现同样效果:
select distinct a.au_fname, a.au_lname from authors a inner join title_authors ta on a.au_id = ta.au_id where ta.royalty_share = 1;
内容的提问来源于stack exchange,提问作者rgo1991
相关产品推荐
相关产品推荐

