2012-05-22 4 views
11

Ich habe eine sehr verwirrende Datenbank mit einer Tabelle, die zwei Werte ich brauche in einer separaten Tabelle. Hier ist mein Problem:Join Tabelle zweimal - auf zwei verschiedenen Spalten der gleichen Tabelle

Table1 
- id 

Table2 
- id 
- table1_id 
- table3_id_1 
- table3_id_2 

Table3 
- id 
- value 

Ich brauche von table1 zu gehen und treten ein, dass mir geben würde den Wert von table3 in zwei getrennten Spalten zurück. Deshalb möchte ich etwas wie folgt aus:

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

Wo X und Y sind die Werte für die Reihe verbunden table3_id_1 und table3_id_2 sind.

Möglicherweise machen sie Variablen oder etwas, so dass ich sie in einer WHERE Klausel auch filtern kann?

Antwort

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; 

Es gibt keine Notwendigkeit, in table1 beizutreten. table2 hat alles, was Sie brauchen - vorausgesetzt, es gibt eine foreign key constraint Garantie referentielle Integrität (alle t2.table1_id sind tatsächlich in table1 vorhanden). Sonst möchten Sie möglicherweise zu table1 beitreten und dadurch nur Zeilen auswählen, die in table1 vorhanden sind.

Ich verwende LEFT [OUTER] JOIN (and not [INNER] JOIN), um beide Instanzen von aus einem ähnlichen Grund beizutreten: Es ist unklar, ob die referenzielle Integrität garantiert ist - und ob eine der Schlüsselspalten NULL sein kann. Ein [INNER] JOIN würde Zeilen aus dem Ergebnis löschen, wo keine Übereinstimmung gefunden wird. Ich nehme an, Sie würden solche Zeilen lieber mit einem Wert für alle fehlenden x oder y anzeigen.

Und table3.id muss UNIQUE sein, oder wir könnten von jedem LEFT JOIN Reihen mit mehreren Spielen multiplizieren:

7

Wenn Sie eine Tabelle mehrmals kommen, verwenden Sie Aliase, sie zu unterscheiden:

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'