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

+1

你可以给一个更详细的问题吗?事实上,它并没有提供太多的信息 – gpeche 2010-11-05 21:06:47

+0

你需要什么细节?我通常是特定的。 – 2010-11-05 21:08:35

+0

“不匹配”是什么意思?你想要没有重复的行? – 2010-11-05 21:10:06

回答

7

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

  • NOT EXISTS
  • NOT IN
  • LEFT JOIN ... WHERE ... IS NULL

这里并不是一个例子存在:

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 
+0

+1以及理解该问题的主要道具。 – 2010-11-05 21:24:46

+0

谢谢。所以要确认,基本上没有使用初始给定字符串的SQL方法,我不得不重构我在其中手动加入UNION ALL查询中的这些用户名的查询? – 2010-11-06 02:52:41

0
Select 
    * 
From 
    users 
Where 
    username 
    NOT IN 
    (
     Select 
      * 
     from 
      users 
     where 
      username 
     NOT IN 
     ("john", "bob", "ray", "ghost") 
    ) 

?? ??

+0

这对我不起作用 – 2010-11-06 02:53:06

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 

当名字是NULL,则setToMatch没有打...

这种查询可以使用SELECT DISTINCT细化或者。

0

虽然not in在这种情况下肯定有效,但更有效(也可能更一般)的方法是将left join与辅助表(无论是否派生)一起使用。因此,寻找一种username S IN表user不会出现在表ref_table,你可以运行:

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

在这个例子中'username'是一个字符串吗?或者像我一样逗号分隔的集合? – 2010-11-06 02:53:40

相关问题