2012-05-22 22 views
11

Tengo una base de datos muy confusa con una tabla que contiene dos valores que necesito en una tabla separada. Aquí está mi problema:Unir mesa dos veces: en dos columnas diferentes de la misma tabla

Table1 
- id 

Table2 
- id 
- table1_id 
- table3_id_1 
- table3_id_2 

Table3 
- id 
- value 

tengo que ir de tabla1 y hacer una combinación que me daría vuelta el valor de table3 en dos columnas separadas. Así que quiero algo como esto:

table1.id | table2.id | table2.table3_id_1 | table2.table3_id_2 | X | Y 

Dónde X y Y son los valores de la fila y conectados por table3_id_1table3_id_2 respectivamente.

¿Posiblemente les haga variables o algo para que pueda filtrarlos en una cláusula WHERE también?

Respuesta

26
SELECT t2.table1_id 
    , t2.id   AS table2_id 
    , t2.table3_id_1 
    , t2.table3_id_2 
    , t31.value  AS x 
    , t32.value  AS y 
FROM table2 t2 
LEFT JOIN table3 t31 ON t31.id = t2.table3_id_1 
LEFT JOIN table3 t32 ON t32.id = t2.table3_id_2; 

No hay necesidad de unir en table1. table2 tiene todo lo que necesita, suponiendo que existe una foreign key constraint que garantiza la integridad referencial (todos t2.table1_id están realmente presentes en table1). De lo contrario, puede unirse al table1, seleccionando solo las filas presentes en table1.

Utilizo LEFT [OUTER] JOIN (and not [INNER] JOIN) para unirme a ambas instancias de table3 por una razón similar: no está claro si la integridad referencial está garantizada, y si cualquiera de las columnas clave puede ser NULL. Un [INNER] JOIN arrojaría filas del resultado donde no se encuentra ninguna coincidencia. Supongo que preferiría mostrar esas filas con un valor de NULL para cualquier x o y faltante.

Y table3.id es necesario que haya UNIQUE, o podríamos multiplicar filas con varios partidos de cada LEFT JOIN:

7

Si se une a una mesa varias veces, utilizar alias para distinguirlos:

SELECT table1.id,table2.id,table2.table3_id_1,table2.table3_id_2,t3_1.id,t3_2.id 
FROM table1 
JOIN table2 ON table1.id=table2.table1_id 
JOIN table3 t3_1 ON table2.table3_id_1=t3_1.id 
JOIN table3 t3_2 ON table2.table3_id_2=t3_2.id 
WHERE ... t3_1.id=... AND ... t3_2.id=... 
3
select t1.id as table1_id, 
    t2.id as table2_id, 
    t2.table3_id_1, 
    t2.table3_id_2, 
    t3_1.value as X, 
    t3_2.value as Y 
from Table1 t1 
inner join Table2 t2 on t1.id = t2.table1_id 
inner join Table3 t3_1 on t2.table3_id_1 = t3_1.id 
inner join Table3 t3_2 on t2.table3_id_2 = t3_2.id 
where t3_1.value = 'some_value' 
    or t3_2.value = 'some_other_value' 
Cuestiones relacionadas