我最近看到有人張貼此作爲一個答案的一部分的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