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

Me gustaría encontrar los distintos valores de Code y obtener un retorno de la siguiente manera:Consulta SQL para encontrar valores distintos en dos tablas?

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

no puedo encontrar la manera de escribir una consulta SQL que me devolvería los resultados anteriores. ¿Alguien tiene alguna experiencia con una consulta como esta o similar?

Respuesta

10

En RDBMS adecuados:

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 

En MySQL ... la UNION elimina duplicados

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 apropiado "no generaría nulos, probablemente usaría atributos de relación de relación para este tipo de consulta;) – onedaywhen

2

Lo que estás buscando es 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

¿Qué tipo de OUTER JOIN? – gbn

+0

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

+0

sí, pero había que añadir que :-) Verás utilicé uno a continuación. .. – gbn

-1

Algo así como:

tbl1.Code SELECT DISTINCT como 1, tbl2.Code DE tbl1 LEFT JOIN TBL2 EN tbl1.Code = TBL2 .code

+0

Esto no te daría la última fila: , D –

+0

Oh, sí, me perdí eso - lo siento – ollie

-1

en realidad, esto se parece a una unión de dos combinaciones externas. Pruebe esto:

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 

La operación UNION solo mantendrá valores distintos.

0

El truco sería la de obtener los valores distintos de ambas tablas, algo como esto:

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 estándar, utilizando operadores relacionales y evitando nulos:

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; 

De nuevo en SQL estándar, esta vez utilizando construcciones que MySQL soporta realidad:

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 
       ); 
Cuestiones relacionadas