2013-03-04 132 views
3

我需要找到WHERE IN子句中的哪些項不存在於數據庫中。在下面的例子cc33不存在,我需要查詢返回cc33。 我該怎麼做?Where where sql query

SELECT id FROM tblList WHERE field1 IN ('aa11','bb22','cc33') 
+0

你會有多個ID爲每個field1? – 2013-03-04 20:52:55

+0

id是唯一的 – 2013-03-04 20:55:52

回答

4

你需要把這些值到一個表,而不是一個列表:

with list as (
    select 'aa11' as val union all 
    select 'bb22' union all 
    select 'cc33' 
) 
select l.val 
from list l left outer join 
    tbllist t 
    on l.val = t.field1 
where t.field1 is null 
+0

爲什麼不選擇'SELECT COALESCE(t.id,l.val)'? (無論如何+1) – zerkms 2013-03-04 20:54:03

+0

我打算做3個單獨的JOIN。這好多了。即使沒有CTE,我們也可以將UNION作爲具有相同邏輯的子查詢。 – 2013-03-04 20:57:19

+0

@zerkms。 .. where語句顯式檢查't'上的所有值都是NULL。如果'id'和'val'是不同的類型,這樣的聚合最多是多餘的,最壞的情況會導致類型衝突。 – 2013-03-04 20:59:50

3

對於2008+的SQL Server版本,你可以使用一個Table Value Constructor:

SELECT field1 
FROM 
    (VALUES 
    ('aa11'),('bb22'),('cc33') 
) AS x (field1) 
WHERE field1 NOT IN 
     (SELECT field1 FROM tblList) ; 

已測試SQL-Fiddle

+0

此查詢也在工作,但我無法使其在sql2000中工作 – 2013-03-04 21:40:05

+0

是的,它是在2008版本中添加的。它不適用於2000或2005版本。 – 2013-03-04 21:41:15

+0

對於以前的版本,您必須堅持Gordon回答的'UNION'版本。 – 2013-03-04 21:44:04