我想过滤名称,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语句无法处理多个列。有谁知道怎么做?
答案 0 :(得分:8)
将列放入括号
SELECT *
FROM TABLE
WHERE (NAME, X) NOT IN (SELECT NAME, X
FROM TABLE WHERE X=Y);
以上是ANSI标准SQL,但并非所有DBMS都支持这种语法。
distinct
或IN
的子查询不需要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);