2010-02-12 41 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) 
相關問題