SELECT
*
FROM
users
WHERE
username IN ("john", "bob", "ray", "sexay")
假设我在桌子上有这些:
ID USERNAME
------------------
1 john
2 bob
3 jack
我想知道哪些套装不匹配,所以我需要"ray" and "sexay"
。有一种纯粹的SQL方式吗?我知道我可以通过多个查询执行此操作,但我有200个左右的用户,如果可以在一个查询中执行,那么很棒。
编辑#1:纯NOT IN
是不够的,因为这将返回与我的用户名集不匹配的所有用户。我不需要每一个,只是我给定集合中的每个用户名字符串都不匹配。
答案 0 :(得分:7)
您需要重新构建查询,以便您的值列表位于派生表中,此时您可以使用其中一种标准方法来测试一个表中的哪些值不在另一个表中。这样做的标准方法是:
以下是NOT EXISTS的示例:
SELECT T1.username
FROM (
SELECT 'john' AS username
UNION ALL
SELECT 'bob'
UNION ALL
SELECT 'ray'
UNION ALL
SELECT 'sexay'
) T1
WHERE NOT EXISTS
(
SELECT NULL
FROM users
WHERE T1.username = users.username
)
或者加入:
SELECT T1.username
FROM (
SELECT 'john' AS username
UNION ALL
SELECT 'bob'
UNION ALL
SELECT 'ray'
UNION ALL
SELECT 'sexay'
) T1
LEFT JOIN users
ON T1.username = users.username
WHERE users.username IS NULL
答案 1 :(得分:0)
Select
*
From
users
Where
username
NOT IN
(
Select
*
from
users
where
username
NOT IN
("john", "bob", "ray", "ghost")
)
...
答案 2 :(得分:0)
我认为,只是一个快速的黑客攻击,尚未经过测试...还有多个查询和特定的MS SQL。不是最好的解决方案,但它可能是从...开始的一点......
CREATE TABLE #tmp (setToMatch VARCHAR(5))
INSERT INTO #tmp VALUES ('john')
-- and others, of course
SELECT u.name,t.setToMatch FROM USERS AS u
RIGHT OUTER JOIN #tmp AS t
ON #tmp.setToMatch = users.name
当name为NULL时,setToMatch没有命中...
可以使用SELECT DISTINCT左右来改进此查询。
答案 3 :(得分:0)
虽然not in
在这种情况下肯定有效,但更有效(也许更通用)的方法是使用带有辅助表的left join
(无论是否派生)。因此,要查找表username
中的user
未显示在表ref_table
中,您可以运行:
select *
from user
left join ref_table using (username)
where ref_table.username is null