【发布时间】:2010-02-12 14:55:57
【问题描述】:
我最近看到有人将此作为 SO 查询问题答案的一部分发布:
SELECT DISTINCT a, b, c
FROM t1
WHERE (a,b,c) NOT IN
( SELECT DISTINCT a,b,c FROM t2 )
我有点困惑,因为我一直认为您不能将多个列用于“NOT IN”(“where(a,b,c)”等)。这是正确的 SQL 语法吗?那么 MySQL 呢?
【问题讨论】:
我最近看到有人将此作为 SO 查询问题答案的一部分发布:
SELECT DISTINCT a, b, c
FROM t1
WHERE (a,b,c) NOT IN
( SELECT DISTINCT a,b,c FROM t2 )
我有点困惑,因为我一直认为您不能将多个列用于“NOT IN”(“where(a,b,c)”等)。这是正确的 SQL 语法吗?那么 MySQL 呢?
【问题讨论】:
谷歌搜索表明它适用于某些数据库,但不适用于其他数据库。你可以改用这个:
SELECT DISTINCT a, b, c
FROM t1
WHERE NOT EXISTS
(SELECT 1 FROM t2
WHERE t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c)
【讨论】:
这是一个 SQL 扩展。 Oracle、PostgreSQL 和 MySQL 都有。 SQL Server 2005 没有它。我不确定其他人。
【讨论】:
它确实在 Oracle 中工作。快速设计的例子:
SQL> select ename, job, deptno from emp
2 where (ename, deptno) in
3 ( select ename, deptno from emp
4 where job = 'MANAGER'
5 );
ENAME JOB DEPTNO
---------- --------- ----------
JONES MANAGER 20
CLARK MANAGER 10
PARAG MANAGER 30
这也有效:
SQL> select ename, job, deptno from emp
2 where (ename, deptno) in (('JONES',20),('CLARK',10));
ENAME JOB DEPTNO
---------- --------- ----------
JONES MANAGER 20
CLARK MANAGER 10
也没有:
SQL> select ename, job, deptno from emp
2 where (ename, deptno) not in
3 ( select ename, deptno from emp
4 where job = 'MANAGER'
5 );
ENAME JOB DEPTNO
---------- --------- ----------
SMITH CLEANER 99
SCOTT ANALYST 20
KING PRESIDENT 10
FORD ANALYST 20
MILLER CLERK 10
【讨论】:
我不知道,但如果你是字符类型(或者可以转换为字符类型),你可以伪造它:
SELECT DISTINCT a, b, c
FROM t1
WHERE a+b+c NOT IN
( SELECT DISTINCT a+b+c FROM t2 )
【讨论】:
试试这个
SELECT DISTINCT a, b, c
FROM t1,
(SELECT DISTINCT a,b,c FROM t2) as tt
WHERE t1.a NOT IN tt.a
AND t1.b NOT IN tt.b
AND t1.c NOT IN tt.c
注意:这还没有经过测试,甚至还没有被证明是正确的。
【讨论】:
其他人已经回答了这个问题,但作为性能建议,如果您要处理任何重要大小的数据,请始终使用 EXISTS 语句而不是 IN。几乎在所有情况下都会更快。
【讨论】: