你可以在查询中使用多列吗?

时间:2010-02-12 14:55:57

标签: sql mysql syntax

我最近看到有人发布此帖子作为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怎么样?

6 个答案:

答案 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。几乎在每种情况下它都会更快。

http://decipherinfosys.wordpress.com/2007/01/21/32/