我最近看到有人张贴此作为一个答案的一部分的SO查询问题:你可以使用多个列作为不在查询中吗?
SELECT DISTINCT a, b, c
FROM t1
WHERE (a,b,c) NOT IN
(SELECT DISTINCT a,b,c FROM t2)
我有点困惑,因为我一直认为你不能使用多列“NOT IN” (“其中(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” (“其中(a,b,c)”等)。这是正确的SQL语法吗?那么MySQL呢?
这是一个SQL扩展。 Oracle,PostgreSQL和MySQL都有。 SQL Server 2005没有它。我不确定其他人。
不,我知道的,但如果thy're字符类型(或可以转换为char类型),您可以伪造它:
SELECT DISTINCT a, b, c
FROM t1
WHERE a+b+c NOT IN
(SELECT DISTINCT a+b+c FROM t2)
这有一个bug。 a ='ab'b ='cd'c ='ef'将与a ='abcd'相匹配b ='e'c ='f'... – 2010-02-12 15:01:02
您需要小心以确保不会“ t根据列内容得到冲突。 ''''''b'''''''ab'+'b'+'c' – tvanfosson 2010-02-12 15:02:30
不适用于以下情况:某些字符串虽然... a + b对于a =“ab”和b =“c”或a =“a”和b =“bc”可能是“abc”。 – Corey 2010-02-12 15:03:05
试试这个
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
注:这没有经过测试,它甚至还没有被证明是正确的。
我的问题不是如何去做 - 我知道有几种方法,我只是想知道语法是否正确,因为有人发布了它,没有人反对。 – froadie 2010-02-12 15:04:47
@froadie请原谅我的误解,其他人已经正确回答了我的问题。 – 2010-02-12 15:13:11
它当然在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
他问的是'NOT IN',而不是'IN' – 2010-02-12 15:07:37
@David Oneill--你不能假设,如果一个人能工作,另一个人能工作吗? – froadie 2010-02-12 15:09:25
添加了NOT IN示例只是为了确保! – 2010-02-12 15:10:02
谷歌搜索这表明,它会在某些数据库中,但不是别人的工作。您可以使用它代替:
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)
其他人已经回答了这个问题,但作为一个性能建议,如果你处理任何显著大小的数据始终使用EXISTS语句,而不是在。几乎在每种情况下都会更快。
Oracle也有。 – 2010-02-12 15:07:34