我最近看到有人发布此帖子作为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怎么样?
答案 0 :(得分:3)
这是一个SQL扩展。 Oracle,PostgreSQL和MySQL都有它。 SQL Server 2005没有它。我不确定别人。
答案 1 :(得分:3)
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)
答案 2 :(得分:2)
它肯定在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
答案 3 :(得分:0)
不是我知道的,但如果它们是字符类型(或者可以转换为字符类型),你可以伪造它:
SELECT DISTINCT a, b, c
FROM t1
WHERE a+b+c NOT IN
( SELECT DISTINCT a+b+c FROM t2 )
答案 4 :(得分:0)
试试这个
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
注意:这尚未经过测试,甚至没有被证实是正确的。
答案 5 :(得分:0)
其他人已经回答了这个问题,但作为性能建议,如果您处理的是任何重要数据的数据,请始终使用EXISTS语句而不是IN。几乎在每种情况下它都会更快。