2011-10-11 6 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 

Je voudrais trouver les Code distinctes valeurs et obtenir un retour comme celui-ci:Requête SQL pour trouver des valeurs distinctes dans deux tables?

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

Je ne peux pas comprendre comment écrire une requête SQL qui me renvoie les résultats ci-dessus. Quelqu'un at-il une expérience avec une requête comme celle-ci ou similaire?

Répondre

10

Dans SGBDR appropriés:

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 

MySQL ... l'UNION supprime les doublons

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 " RDBMS correct "ne générerait pas de valeurs nulles, utiliserait probablement des attributs relation-évalués pour ce type de requête;) – onedaywhen

2

Qu'est-ce que vous cherchez est 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

Quel type d'OUTER JOIN? – gbn

+0

@gbn - Une 'jointure externe complète': http://en.wikipedia.org/wiki/Join_(SQL)#Full_outer_join –

+0

oui, mais vous deviez l'ajouter :-) Vous verrez que j'en ai utilisé un ci-dessous. .. – gbn

-1

Quelque chose comme:

SELECT DISTINCT tbl1.Code comme 1, tbl2.Code DE tbl1 LEFT JOIN tbl2 SUR tbl1.Code = tbl2 .Code

+0

Cela ne vous obtiendrait pas la dernière rangée: , D –

+0

Oh ouais, j'ai raté cela - désolé – ollie

-1

Cela ressemble en fait à une union de deux jointures externes. Essayez ceci:

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'opération UNION ne conserve que des valeurs distinctes.

0

L'astuce serait d'obtenir les valeurs distinctes des deux tables, quelque chose comme ceci:

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

En SQL standard, en utilisant des opérateurs relationnels et en évitant les valeurs nulles:

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; 

Encore une fois dans la norme SQL, cette fois en utilisant des constructions que MySQL supporte réellement:

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 
       ); 
Questions connexes