2012-05-22 63 views
11

私は別のテーブルに必要な2つの値を保持するテーブルを持つ非常に混乱しやすいデータベースを持っています。同じテーブルの2つの異なるカラムでテーブルを2回結合する

Table1 
- id 

Table2 
- id 
- table1_id 
- table3_id_1 
- table3_id_2 

Table3 
- id 
- value 

私はTABLE1から行くと、その2つの別々の列にtable3から値を私に戻って与える加入実行する必要があります。ここに私の問題です。だから私はこのような何かしたい:

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

XYをそれぞれtable3_id_1table3_id_2によって接続された行の値です。

おそらく変数や何かを作って、WHERE節でフィルタリングすることができますか?

答えて

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; 

table1に参加する必要はありません。 table2には、参照整合性を保証するforeign key constraintがあるとします(table1にはすべてt2.table1_idが実際に存在します)。そうでなければ、table1に参加して、table1にある行だけを選択することができます。

同様の理由から、table3の両方のインスタンスに参加するためにLEFT [OUTER] JOIN (and not [INNER] JOIN)を使用します。参照整合性が保証されているかどうかは、キー列がNULLかどうかは不明です。 [INNER] JOINは、一致が見つからない結果から行を削除します。私は、NULLの値がxまたはyである行を表示するとします。

そしてtable3.idUNIQUEにする必要がある、または私たちは、各LEFT JOINからいくつかの試合で行を掛けるかもしれない:

7

あなたがテーブルを複数回参加する場合は、それらを区別するためにエイリアスを使用します。

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' 
関連する問題