2014-03-03 31 views
0

有点堆栈,并无法弄清楚。想知道如果你能帮助... 我要排除帐户与100开始...
sql与不存在返回架构,但没有记录

SELECT * 
    FROM Inventory --returns 300 records 
SELECT * 
    FROM Inventory 
WHERE AccNum LIKE '100%' --returns 50 records 

但是这一次返回模式,并没有记录。为什么?我应该得到250条记录...

SELECT * 
    FROM Inventory 
WHERE NOT EXISTS(SELECT * 
        FROM Inventory 
        WHERE AccNum LIKE '100%') 

回答

2

我想你的意思:

SELECT * FROM Inventory 
WHERE AccNum not in (SELECT AccNum FROM Inventory WHERE AccNum LIKE '100%') 

在原来的 'SELECT * FROM库存WHERE AccNum LIKE'100%' 将始终返回记录,所以不存在将永远失败

+0

我用不是这个原因EXISTS,因为我需要使用AccNum LIKE“100%”或AccNum LIKE“200 %'。 NOT IN只支持一个条件。 – user3200249

+0

该表达式可以包含更多位: 不在(SELECT AccNum FROM Inventory WHERE AccNum LIKE'100%'或AccNum like'200%') – Rob

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; 
+0

感谢,当我将子查询更改为:
SELECT * FROM Inventory i2 WHERE AccNum LIKE '100%' 或AccNum LIKE '200%' 和i2.AccNum = i.AccNum
我有没有记录一次。 :( – user3200249

相关问题