如何找到* my set中的哪些元素*不匹配?

时间:2010-11-05 21:01:01

标签: sql

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是不够的,因为这将返回与我的用户名集不匹配的所有用户。我不需要每一个,只是我给定集合中的每个用户名字符串都不匹配。

4 个答案:

答案 0 :(得分:7)

您需要重新构建查询,以便您的值列表位于派生表中,此时您可以使用其中一种标准方法来测试一个表中的哪些值不在另一个表中。这样做的标准方法是:

  • NOT EXISTS
  • 不在
  • LEFT JOIN ... WHERE ... IS NULL

以下是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