SELECT splname FROM qspl
WHERE splno NOT IN
(SELECT splno FROM qdel
WHERE itemname = 'Compass'
OR itemname = 'Geopositioning System');
Select splname
From qdel a,qspl b
Where a.splno=b.splno
And (a.itemname != ('Compass') or a.itemname != ('Geopositioning System'))
这是ERD图
图片说明
只是看起来一样而已,,,
第二句判断条件or改为and
第一条SQL为子查询,第二条SQL为连接查询
看似一样,看你判断条件所导致的结果是不一样的。
第一条中的 NOT IN 排除了 itemname 为('Compass') 和 ('Geopositioning System')
第二条 And 后面的意思是itemname不能为('Compass')或者 ('Geopositioning System'),
所以第二条的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就不一样了