2010-02-12 87 views
5

我最近看到有人张贴此作为一个答案的一部分的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呢?

回答

3

这是一个SQL扩展。 Oracle,PostgreSQL和MySQL都有。 SQL Server 2005没有它。我不确定其他人。

+0

Oracle也有。 – 2010-02-12 15:07:34

0

不,我知道的,但如果thy're字符类型(或可以转换为char类型),您可以伪造它:

SELECT DISTINCT a, b, c 
FROM t1 
WHERE a+b+c NOT IN 
    (SELECT DISTINCT a+b+c FROM t2) 
+0

这有一个bug。 a ='ab'b ='cd'c ='ef'将与a ='abcd'相匹配b ='e'c ='f'... – 2010-02-12 15:01:02

+0

您需要小心以确保不会“ t根据列内容得到冲突。 ''''''b'''''''ab'+'b'+'c' – tvanfosson 2010-02-12 15:02:30

+0

不适用于以下情况:某些字符串虽然... a + b对于a =“ab”和b =“c”或a =“a”和b =“bc”可能是“abc”。 – Corey 2010-02-12 15:03:05

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 

注:这没有经过测试,它甚至还没有被证明是正确的。

+0

我的问题不是如何去做 - 我知道有几种方法,我只是想知道语法是否正确,因为有人发布了它,没有人反对。 – froadie 2010-02-12 15:04:47

+0

@froadie请原谅我的误解,其他人已经正确回答了我的问题。 – 2010-02-12 15:13:11

1

它当然在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 
+0

他问的是'NOT IN',而不是'IN' – 2010-02-12 15:07:37

+0

@David Oneill--你不能假设,如果一个人能工作,另一个人能工作吗? – froadie 2010-02-12 15:09:25

+0

添加了NOT IN示例只是为了确保! – 2010-02-12 15:10:02

2

谷歌搜索这表明,它会在某些数据库中,但不是别人的工作。您可以使用它代替:

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) 
相关问题