代码之家  ›  专栏  ›  技术社区  ›  meder omuraliev

我怎样才能找到我的集合中哪些元素不匹配?

sql
  •  3
  • meder omuraliev  · 技术社区  · 14 年前
    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 回复  |  直到 14 年前
        1
  •  7
  •   Mark Byers    14 年前

    您需要重新构造查询,使值列表位于派生表中,此时可以使用标准方法之一来测试一个表中的哪些值不在另一个表中。执行此操作的标准方法是:

    • 不存在
    • 不在

    下面是不存在的示例:

    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
    
        2
  •  0
  •   BentOnCoding    14 年前
    Select 
        * 
    From
        users
    Where
        username 
        NOT IN
        (
             Select 
                 * 
             from 
                 users 
             where 
                 username 
             NOT IN 
             ("john", "bob", "ray", "ghost")
        )
    

        3
  •  0
  •   Patrick Echterbruch    14 年前

    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为空时,setToMatch没有命中。。。

    这个查询可以使用SELECT DISTINCT或so进行优化。

        4
  •  0
  •   Gingi    14 年前

    not in 在这种情况下确实有效,一种更有效(也许更通用)的方法是使用 left join 有一个辅助表(不管是否派生)。所以,找出 username 表中的s user ref_table ,您可以运行:

    select *
      from user
           left join ref_table using (username)
     where ref_table.username is null