多列的SQL“IN”语句

时间:2014-07-14 09:25:13

标签: sql distinct

我想过滤名称,X组合从不X = Y 我们假设下表:

*Name*     *X*      *Y*
   A        2        1
   A        2        2   <--- fulfills requirement for Name=A, X=2
   A       10        1
   A       10        2
   B        3        1
   B        3        3   <--- fulfills requirement for Name=B, X=3
   B        1        1   <--- fulfills requirement for Name=B, X=1
   B        1        3

所以我想返回组合Name = A,X = 10,其中X = Y永远不是真的。 这是我的方法(在语法上不正确)

SELECT * 
FROM TABLE 
WHERE NAME
     , X NOT IN (SELECT DISTINCT NAME
                       , X 
                 FROM TABLE 
                 WHERE X=Y)

我的问题是where语句无法处理多个列。有谁知道怎么做?

4 个答案:

答案 0 :(得分:8)

将列放入括号

SELECT * 
FROM TABLE 
WHERE (NAME, X) NOT IN (SELECT NAME, X 
                        FROM TABLE WHERE X=Y);

以上是ANSI标准SQL,但并非所有DBMS都支持这种语法。

distinctIN的子查询不需要NOT IN

但是,NOT EXISTS与共同相关的子查询通常比NOT IN条件更快。

答案 1 :(得分:1)

我认为你可以用两个条件来实现这个目标

SELECT * 
FROM TABLE 
WHERE NAME NOT IN(
    SELECT a.NAME FROM TABLE a WHERE a.X=a.Y
) AND X NOT IN (
    SELECT b.X FROM TABLE b WHERE b.X=b.Y
)

答案 2 :(得分:1)

SELECT * 
FROM TABLE T 
WHERE NOT EXISTS (SELECT NAME
                  ,X 
              FROM TABLE t2 
              WHERE t1.Name=t2.Name
                    AND t1.X=t2.Y)

这将检查是否有这样的记录

答案 3 :(得分:0)

我在SQL Server上使用它

SELECT * 
FROM TABLE 
WHERE (SELECT NAME + ';' + X)
    NOT IN (SELECT NAME + ';' + X
        FROM TABLE WHERE X = Y);