Oracle中查询播放列表时Inner Join与NOT IN子查询结果差异问题
两条查询结果差异原因
核心原因是两条SQL的判断逻辑完全不同,只有第二条符合需求:
- 第一条SQL实际是筛选「只要有任意一首歌不属于指定艺术家就保留播放列表」,逻辑完全错误
- 第二条SQL是真正筛选「完全没有指定艺术家任何曲目的播放列表」,逻辑正确
第一条查询错误原因
第一条SQL先关联所有播放列表、曲目、专辑、艺术家的对应关系,每一条关联记录对应「播放列表里的某一首具体曲目」。where条件Artist.name not in('Black Sabbath','Chico Buarque')只是把属于这两个艺术家的单条曲目记录删掉,只要播放列表里还有其他艺术家的曲目,对应的关联记录就会留存,distinct去重后这个播放列表还是会出现在结果里。
举个实际例子:播放列表id=1里同时有Chico Buarque的曲目和其他歌手的曲目,过滤时只会删掉Chico Buarque对应的关联行,其他歌手的行还保留,最后去重后id=1还是会被输出,和需求完全相悖。
第二条查询正确原因
第二条SQL的逻辑完全贴合需求:子查询先查出所有包含过这两个艺术家任意曲目的播放列表ID,外层直接过滤掉这些ID,剩下的就是完全没有出现过这两个艺术家曲目的播放列表,所以结果正确。
内容的提问来源于stack exchange,提问作者Vaibhav Gautam
相关产品推荐
相关产品推荐

