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

med*_*iev 3 sql

SELECT
*
FROM
users
WHERE
username IN ("john", "bob", "ray", "sexay")
Run Code Online (Sandbox Code Playgroud)

假设我在桌子上有这些:

ID  USERNAME
------------------
1   john
2   bob
3   jack
Run Code Online (Sandbox Code Playgroud)

我想知道我的哪一套不匹配,所以我需要"ray" and "sexay".有一种纯粹的SQL方式吗?我知道我可以通过多个查询执行此操作,但我有200个左右的用户,如果可以在一个查询中执行,那么很棒.

编辑#1:纯粹NOT IN是不够的,因为这将返回与我的用户名集不匹配的所有用户.我不需要每一个,只是我给定集合中的每个用户名字符串都不匹配.

Mar*_*ers 7

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

  • 不存在
  • 不在
  • LEFT JOIN ... WHERE ...是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
)
Run Code Online (Sandbox Code Playgroud)

或者加入:

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
Run Code Online (Sandbox Code Playgroud)