2010-02-12 12 views
5

ich sah, wie jemand schreibt dies vor kurzem als Teil einer Antwort auf eine SO Abfrage Frage:Können Sie mehrere Spalten für eine nicht in Abfrage verwenden?

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

ich ein wenig verwirrt bin, wie ich dachte immer, dass Sie nicht mehr Spalten für „NOT IN“ verwenden kann, ("wo (a, b, c)" usw.). Ist das die korrekte SQL-Syntax? Und was ist mit MySQL?

Antwort

3

Es ist eine SQL-Erweiterung. Oracle, PostgreSQL und MySQL haben es. SQL Server 2005 hat es nicht. Ich bin mir über andere nicht sicher.

+0

Oracle hat es auch. –

0

Nicht, dass ich bin mir dessen bewusst, aber wenn thy're Zeichentyp (oder umgewandelt werden Typen char), können Sie fälschen:

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

Dies hat einen Fehler. a = 'ab' b = 'cd' c = 'ef' passt zu a = 'abcd' b = 'e' c = 'f' ... –

+0

Sie müssen vorsichtig sein, um sicher zu gehen t Kollisionen basierend auf dem Spalteninhalt erhalten. Ich würde Trennzeichen einfügen, damit die Spalten nicht versehentlich zusammenlaufen, was zu falsch positiven Ergebnissen führt: 'a' + 'bb' + 'c' == 'ab' + 'b' + 'c' – tvanfosson

+0

Funktioniert nicht für bestimmte Strings obwohl ... a + b könnte "abc" für a = "ab" und b = "c" oder a = "a" und b = "bc" sein. – Corey

0

diesen

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 

Hinweis Versuchen: Diese wurden nicht getestet, es ist nicht einmal richtig erwiesen.

+0

Meine Frage ist nicht, wie es geht - ich weiß von ein paar Wegen. Ich wollte nur weiß, ob die Syntax korrekt war, da jemand sie gepostet hat und niemand etwas dagegen gemacht hat. – froadie

+0

@froadie Verzeihung, mein Mißverständnis. Andere Leute haben deine Frage richtig beantwortet. Ich sehe. –

1

Es funktioniert sicherlich in Oracle. Schnell konstruiertes Beispiel:

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 

Dies funktioniert auch:

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 

NICHT zu:

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

Er fragt nach 'NICHT IN'. Nicht nur 'IN' –

+0

@David Oneill - kannst du nicht davon ausgehen, dass, wenn einer funktioniert, auch der andere? – froadie

+0

Hinzugefügt NOT IN Beispiel nur um sicher zu sein ! –

2

googeln es legt nahe, dass es auf einigen Datenbanken funktionieren, andere aber nicht. Sie können dies stattdessen verwenden:

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) 
Verwandte Themen