2010-03-02 8 views
31

Tengo dos tablas con información similar. Vamos a llamarlos items_a y items_b. Deben ser uno, pero provienen de diferentes fuentes, por lo que no lo son. Cuando me uno a la tabla completa, algunas filas terminan con datos de una o ambas tablas. Una de las columnas en ambas tablas es category_id. Me gustaría cruzar la tabla combinada con la tabla de categorías usando category_id. Sin embargo, ahora tengo dos columnas category_id (una desde items_a y una desde items_b). ¿Hay alguna manera de unir las dos columnas en una sola?¿Cómo puedo fusionar las columnas de dos tablas en una salida?

Espero que esto no sea demasiado confuso.

Respuesta

33

Especificación de las columnas de la consulta debe hacer el truco:

select a.col1, b.col2, a.col3, b.col4, a.category_id 
from items_a a, items_b b 
where a.category_id = b.category_id 

debe hacer el truco con respecto a recoger las columnas que desee.

para moverse por el hecho de que algunos datos son sólo en items_a y algunos datos están sólo en items_b, que sería capaz de hacer:

select 
    coalesce(a.col1, b.col1) as col1, 
    coalesce(a.col2, b.col2) as col2, 
    coalesce(a.col3, b.col3) as col3, 
    a.category_id 
from items_a a, items_b b 
where a.category_id = b.category_id 

La función se unen devolverá el primer valor no nulo, entonces para cada fila si col1 no es nulo, usará eso, de lo contrario obtendrá el valor de col2, etc.

+0

¿Puedo usarlo en donde tales como: ... donde se unen c.col1 = (a.col1, b.col1) ? – burger

+0

@bigmac: no debería ser un problema – beny23

+1

¿Qué pasa si no hay una identificación común? Solo quiero que las columnas se unan entre sí sin una identificación común, simplemente el orden en el que aparecen. – CMCDragonkai

21

Supongo que lo que quiere hacer es un UNION de both tables.

Si ambas tablas tienen las mismas columnas a continuación, puedes hacer

SELECT category_id, col1, col2, col3 
    FROM items_a 
UNION 
SELECT category_id, col1, col2, col3 
    FROM items_b 

Si no, puede que tenga que hacer algo como

SELECT category_id, col1, col2, col3 
    FROM items_a 
UNION 
SELECT category_id, col_1 as col1, col_2 as col2, col_3 as col3 
    FROM items_b 
+0

Su primer ejemplo no es una declaración 'UNION' válida; debería ser literalmente una combinación de dos instrucciones SELECT. El segundo ejemplo no requiere los corchetes y, por lo demás, es sintácticamente correcto. –

-2

He tenido un problema similar con una pequeña diferencia: algunos a.category_id no están en b y algunos b.category_id no están en a.
Para resolver este problema simplemente adaptar la respuesta excelente de beny23 a

 
select a.col1, b.col2, a.col3, b.col4, a.category_id 
from items_a a 
LEFT OUTER JOIN 
items_b b 
on a.category_id = b.category_id 

Espero que esto ayude a alguien.
Saludos.

-1
SELECT col1, 
    col2 
FROM 
    (SELECT rownum X,col_table1 FROM table1) T1 
INNER JOIN 
    (SELECT rownum Y, col_table2 FROM table2) T2 
ON T1.X=T2.Y; 
+2

Es difícil leer esto como una respuesta a la pregunta original. Si bien el concepto puede ser correcto, necesita alguna explicación para mostrar cómo se relaciona con la pregunta. – Blackwood

+0

Esta respuesta me ayudó a combinar dos columnas de dos tablas diferentes y mostrarlas como dos columnas diferentes en una sola consulta. –

-2

Cuando su son tres mesas o más, sólo tiene que añadir la unión y externa izquierda:

select a.col1, b.col2, a.col3, b.col4, a.category_id 
from 
(
    select category_id from a 
    union 
    select category_id from b 
) as c 
left outer join a on a.category_id = c.category_id 
left outer join b on b.category_id = c.category_id 
Cuestiones relacionadas