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
似乎您只是在“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)