You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么SQL关联子查询可正确筛选独著作者,普通子查询却返回全部作者

两条SQL结果差异的核心原因

两条语句的本质区别是子查询的类型不同,执行逻辑完全不一样:

关联子查询(第一条语句)

  • 子查询和外层的authors表存在关联条件a.au_id = ta.au_id,执行时会逐行遍历authors表的每一条作者记录:
    1. 取当前作者的au_id值,代入子查询的筛选条件
    2. 只查询这个作者自己在title_authors表中的所有royalty_share值,判断集合中是否存在1
    3. 只有存在1(该作者有独著作品)时,才会保留这条作者记录
  • 所以这条语句的筛选逻辑完全匹配需求,返回结果正确。

非关联子查询(第二条语句)

  • 子查询没有和外层authors表的关联条件,会独立执行:
    1. 先直接取出title_authors表中所有记录的royalty_share值,生成一个全局集合
    2. 只要这个全局集合里存在至少一个1(测试表中显然存在独著作品,所以这个判断永远为真)
    3. 外层的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:54:07