有点堆叠,无法弄清楚。想知道你是否能帮忙......
我想排除以100开始的帐户...
SELECT *
FROM Inventory --returns 300 records
SELECT *
FROM Inventory
WHERE AccNum LIKE '100%' --returns 50 records
但是这个会返回架构和NO记录。为什么?我应该得到250条记录......
SELECT *
FROM Inventory
WHERE NOT EXISTS(SELECT *
FROM Inventory
WHERE AccNum LIKE '100%')
答案 0 :(得分:5)
让我解释为什么您的查询首先失败,然后显示如何解决它。
这是不能按预期工作的查询:
SELECT *
FROM Inventory
WHERE NOT EXISTS(SELECT * FROM Inventory WHERE AccNum LIKE '100%');
它不返回任何行的原因是where
子句。子查询返回50行。因此,它存在。换句话说,此版本的查询将返回表中的所有行或不返回任何行。行与行之间没有任何变化。
解决此问题的一种方法是使用in
:
SELECT *
FROM Inventory i
WHERE AccNum NOT IN (SELECT AccNum FROM Inventory i2 WHERE AccNum LIKE '100%');
只要AccNum
永远不会NULL
。
当然,更简单的方法就是使用简单的where
子句:
SELECT *
FROM inventory
WHERE AccNum NOT LIKE '100%' OR AccNum IS NULL;
答案 1 :(得分:2)
我认为你的意思是:
SELECT * FROM Inventory
WHERE AccNum not in (SELECT AccNum FROM Inventory WHERE AccNum LIKE '100%')
在您原来的'SELECT * FROM Inventory WHERE AccNum LIKE'100%''将始终返回记录,因此NOT EXISTS将始终失败