2011-10-11 30 views
5
Table 1    Table 2 
Number | Code  Code | Description 
1234  A   A  Something 
1235  B   C  Something else 
1246  C   D  Something other 
1247  A 
1248  B 
1249  A 

Mi piacerebbe trovare i distinti Code valori e ottenere un ritorno come questo:Query SQL per trovare valori distinti in due tabelle?

1 | 2 
------- 
A  A 
B 
C  C 
     D 

io non riesco a capire come scrivere una query SQL che mi avrebbe restituire i risultati di cui sopra. Qualcuno ha esperienza con una query come questa o simili?

risposta

10

In RDBMS corrette:

SELECT 
    T1.Code, T2.Code 
FROM 
    (SELECT DISTINCT Code FROM Table1) T1 
    FULL OUTER JOIN 
    (SELECT DISTINCT Code FROM Table2) T2 
       ON T1.Code = T2.Code 

In MySQL ... l'Unione rimuove i duplicati

SELECT 
    T1.Code, T2.Code 
FROM 
    Table1 T1 
    LEFT OUTER JOIN 
    Table2 T2 ON T1.Code = T2.Code 
UNION 
SELECT 
    T1.Code, T2.Code 
FROM 
    Table1 T1 
    RIGHT OUTER JOIN 
    Table2 T2 ON T1.Code = T2.Code 
+0

A ". corretto RDBMS "non genererebbe nulla, probabilmente userebbe attributi con valori relazionali per questo tipo di query;) – onedaywhen

2

Quello che stai cercando è un full outer join:

select a.code as code_1,b.code as code_2 
from(
    select code 
    from table1 
    group by 1 
)a 
full outer join(
    select code 
    from table2 
    group by 1 
)b 
using(code) 
order by 1; 
+0

Che tipo di OUTER JOIN? – gbn

+0

@gbn - Un 'full outer join ': http://en.wikipedia.org/wiki/Join_(SQL)#Full_outer_join –

+0

sì, ma dovevi aggiungerlo :-) Vedrai che ne ho usato uno in basso. .. – gbn

-1

Qualcosa di simile:

SELEZIONA tbl1.Code DISTINCT come 1, tbl2.Code DA tbl1 LEFT JOIN tbl2 ON tbl1.Code = tbl2 .Codice

+0

Questo non ti porterà l'ultima riga: , D –

+0

Oh sì, mi sono perso - spiacente – ollie

-1

Questo in realtà sembra un UNION di due join esterni. Prova questo:

SELECT t1.Code, t2.Code 
FROM Table1 AS t1 
LEFT JOIN Table2 AS t2 ON t1.Code 

UNION 

SELECT t1.Code, t2.Code 
FROM Table1 AS t1 
RIGHT JOIN Table2 AS t2 ON t1.Code 

ORDER BY 1, 2 

L'operazione UNION manterrà solo valori distinti.

0

Il trucco sarebbe quello di ottenere i valori distinti da entrambe le tabelle, qualcosa di simile:

SELECT a.Code, b.code 
FROM 
(--Get the DISTICT Codes from all sets 
    SELECT Distinct Code from Table1 
    UNION SELECT Distinct Code from Table2 
) x Left JOIN 
Table1 a ON x.code = a.Code LEFT JOIN 
Table2 b ON x.code = b.Code 
2

In SQL standard, utilizzando operatori relazionali ed evitando valori nulli:

SELECT Code AS col_1, Code AS col_2 
    FROM Table_1 
INTERSECT 
SELECT Code AS col_1, Code AS col_2 
    FROM Table_2 

UNION 

SELECT Code AS col_1, 'missing' AS col_2 
    FROM Table_1 
EXCEPT 
SELECT Code AS col_1, 'missing' AS col_2 
    FROM Table_2 

UNION 

SELECT 'missing' AS col_1, Code AS col_2 
    FROM Table_2 
EXCEPT 
SELECT 'missing' AS col_1, Code AS col_2 
    FROM Table_1; 

Sempre in standard SQL, questa volta usando costrutti che MySQL supporta in realtà:

SELECT Code AS col_1, Code AS col_2 
    FROM Table_1 
WHERE EXISTS (
       SELECT * 
       FROM Table_2 
       WHERE Table_2.Code = Table_1.Code 
      ) 

UNION 

SELECT Code AS col_1, 'missing' AS col_2 
    FROM Table_1 
WHERE NOT EXISTS (
        SELECT * 
        FROM Table_2 
        WHERE Table_2.Code = Table_1.Code 
       ) 
UNION 

SELECT 'missing' AS col_1, Code AS col_2 
    FROM Table_2 
WHERE NOT EXISTS (
        SELECT * 
        FROM Table_1 
        WHERE Table_1.Code = Table_2.Code 
       ); 
Problemi correlati