2012-02-04 71 views
1

假設我有一個表USR返回提供的列表中的非匹配值

user_name  User_id 
Abcd    1 
Abce    2 
Abcf    3 

現在,如果我打像

Select user_name from USR where user_name IN ('Abcd','Abce','Abcg','Avfd','Asdf') 

查詢我得到一個輸出

Abcd 
Abce 

現在什麼如果我想要這個輸出的非匹配參數。

Abcg 
Avfd 
Asdf 

有沒有辦法做到這一點?

感謝您的建議。

編輯:我沒有獲得創造任何&唯一能做的DQL

+0

RDBMS什麼您使用的是:

SELECT user_name FROM (VALUES('Abcd'),('Abce'),('Abcg'),('Avfd'),('Asdf')) AS Q(user_name) EXCEPT SELECT [USER_NAME] FROM #USER 

這應該與任何RDBMS(我認爲)工作? – 2012-02-04 18:44:36

回答

0

如何做一個新表溫度

abcd 
abce 
abcg 
avfd 
asdf 

然後

Select user_name from Temp where user_name NOT IN USR 
+0

不錯,但我已經告訴我不能創建任何東西......所以沒有表 – perilbrain 2012-02-04 18:00:55

+0

我懷疑有一種方法可以做出臨時表。 – Skyrel 2012-02-04 18:26:02

0

原始查詢:

SELECT user_name 
FROM usr 
WHERE user_name IN ('Abcd','Abce','Abcg','Avfd','Asdf') 
    ; 

要反向邏輯,只要加入「不」:

SELECT user_name 
FROM usr 
WHERE user_name NOT IN ('Abcd','Abce','Abcg','Avfd','Asdf') 
    ; 

哎呀,看來你想讓它周圍的其他方法:(該解決方案可以需要其他的語法,這取決於你的DBMS/SQL方言)這句法對於PostgreSQL是經由CTE:

WITH zzz(zname) AS (
     VALUES ('three'),('four'), ('five') 
     ) 
SELECT * FROM zzz 
     WHERE zzz.zname NOT IN (select zname FROM usr) 
     ; 

生成一些數據:

SET search_path='tmp'; 
DROP TABLE usr; 
CREATE TABLE usr 
     (id INTEGER NOT NULL 
     , zname varchar 
     ); 
INSERT INTO usr(id,zname) VALUES 
(1, 'one'),(2, 'two') 
,(3, 'three'),(4, 'four') 
     ; 

結果:

SET 
DROP TABLE 
CREATE TABLE 
INSERT 0 4 
zname 
------- 
five 
(1 row) 
+0

我認爲你錯過了一點 - 我閱讀它的方式是他想從IN子句中輸出user_names而不是USR表。 – Goran 2012-02-04 18:12:03

+0

@wildplasser: - 你的查詢只返回'Abcf',Goran是對的。 – perilbrain 2012-02-04 18:15:59

+0

我錯過了OP。最後的查詢是正確的。 ( 我認爲 ...) – wildplasser 2012-02-04 18:32:39

0

假設你使用可以使用SQL Server 2008的電視構造函數:

SELECT 'Abcd' AS [user_name] 
UNION SELECT 'Abce' 
UNION SELECT 'Abcg' 
UNION SELECT 'Avfd' 
UNION SELECT 'Asdf' 

EXCEPT 

SELECT [user_name] 
FROM #USER