问题描述
- 为什么这两句我看似一样的SQL输出的结果不一样? 3C
-
SELECT splname FROM qsplWHERE splno NOT IN(SELECT splno FROM qdelWHERE itemname = 'Compass'OR itemname = 'Geopositioning System'); Select splnameFrom qdel aqspl bWhere a.splno=b.splnoAnd (a.itemname != ('Compass') or a.itemname != ('Geopositioning System'))
这是ERD图
图片说明
解决方案
第一条SQL为子查询,第二条SQL为连接查询
看似一样,看你判断条件所导致的结果是不一样的。
第一条中的 NOT IN 排除了 itemname 为('Compass') 和 ('Geopositioning System')
第二条 And 后面的意思是itemname不能为('Compass')或者 ('Geopositioning System'),
所以第二条的or 应该改为 and
解决方案二:
只是看起来一样而已,,,
解决方案三:
第二句判断条件or改为and
解决方案四:
楼主没有理清楚SQL的含义。
第一句:NOT IN 表示查询值qspl.splno不在子查询(SELECT splno FROM qdel .....)中的
第二句:两表关联,使用的是等值连接,所以左右表互相具有过滤效果。
但是楼主的第一个WHERE条件表示:qdel.splno等于qspl.splno,这啥意思?就是说你的qdel.splno存在于qspl.splno这个中,
这就相当于:IN的作用了:FROM qspl WHERE splno IN (SELECT splno FROM qdel)
后面两个条件正确
改写后的正确SQL:
SELECT splname FROM qspl b LEFT JOIN qdel a ON b.splno = a.splno AND (a.itemname = ('Compass') OR a.itemname = ('Geopositioning System')) WHERE b.splno IS NOT NULL;
总结,这是一道将NOT IN 改写成 JOIN的操作,建议楼主深入的体会下:NOT IN 、NOT EXISTS、LEFT JOIN+ NOT NULL。这三者的用法。并且有啥限制,这才是问题的根本
解决方案五:
假如not in的子查询里有null就不一样了
时间: 2024-09-14 12:00:19