返回提供的列表中的非匹配值

问题描述:

假设我有一个表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

如何做一个新表温度

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

原始查询:

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

假设你使用可以使用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