SQL获取项目不在列表中

Ban*_*man 2 sql t-sql sql-server sql-server-2008

我正在使用MS SQL Server 2008 R2,我有一个电子表格的电子邮件列表,我插入到用户表的查询中.在列表中的821封电子邮件中,它返回了759行.有没有简单的方法让它返回不在表中的电子邮件?我只对数据库具有读访问权限,因此无法创建包含电子邮件列表的表 - 仅获取结果.这是我用来获取那些电子邮件列表的查询的简化版本:

select *
from UserTbl
where username in ('email1','email2','email3',...'email821')
Run Code Online (Sandbox Code Playgroud)

我可以提出一个Unix shell解决方案,但知道如何在MS SQL中执行它会更有用.我实际上发现了一些接近stackoverflow解决方案的东西("T-SQL:如何在值列表中选择不在表中的值?"),但它似乎对我不起作用(为了我的需要,我只想要不在表输出中的列表):

SELECT username,
    CASE
        WHEN EXISTS(SELECT * FROM UsersTbl tu WHERE E.email = tu.username) THEN 'Exist'
        ELSE 'Not Exist'
    END AS
FROM (VALUES('email1'),('email2'),('email3'),('email4')) E(email)
Run Code Online (Sandbox Code Playgroud)

这给了我错误"运行查询时关键字'FROM'附近的语法不正确".顺便说一句,我正在谷歌上搜索上面使用的VALUES关键字的描述,但没有找到任何有用的信息.

如果有人能帮助我,我将不胜感激.

谢谢,本

Aar*_*and 11

如果您只想要一个尚未出现的电子邮件列表,这似乎更简单:

SELECT e.email
FROM 
(
  VALUES('email1'),('email2'),('email3'),('email4')
) AS e(email)
WHERE 
NOT EXISTS
(
  SELECT 1
    FROM dbo.UsersTbl 
    WHERE username = e.email
);
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

SELECT e.email 
FROM 
(
  VALUES('email1'),('email2'),('email3'),('email4')
) AS e(email)
EXCEPT
SELECT username FROM dbo.UsersTbl;
Run Code Online (Sandbox Code Playgroud)

要了解我更喜欢NOT EXISTS/ EXCEPT过度LEFT JOIN或其他替代方案的原因,请参阅:

http://www.sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join


Rap*_*aus 4

似乎您只是在“AS”之后缺少一个别名

SELECT username,
    CASE
        WHEN EXISTS(SELECT * FROM UsersTbl tu WHERE E.email = tu.username) THEN 'Exist'
        ELSE 'Not Exist'
    END AS doesExist
FROM (VALUES('email1'),('email2'),('email3'),('email4')) E(email)
Run Code Online (Sandbox Code Playgroud)