web-dev-qa-db-ja.com

テーブルを2回結合-同じテーブルの2つの異なる列で

別のテーブルに必要な2つの値を保持するテーブルを持つ非常に紛らわしいデータベースがあります。私の問題は次のとおりです。

Table1
- id

Table2
- id
- table1_id
- table3_id_1
- table3_id_2

Table3
- id
- value

Table1から行って、table3の値を2つの別々の列に戻す結合を行う必要があります。だから私はこのようなものが欲しい:

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

ここで、XYは、それぞれtable3_id_1table3_id_2で接続された行の値です。

おそらく変数または何かにして、WHERE句でもフィルターできるようにしますか?

17
Red
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には必要なものがすべてあります-参照整合性を保証する 外部キー制約 があると仮定します(すべてのt2.table1_idは実際にtable1に存在します)。そうでない場合は、table1に参加して、table1にも存在する行のみを選択できます。

LEFT [OUTER] JOIN[INNER] JOINではなく) を使用して、同様の理由でtable3の両方のインスタンスに参加します。整合性が保証されます-キー列のいずれかがNULLになる可能性があるかどうか。 [INNER] JOINは、一致が見つからない結果から行を削除します。 NULLまたはxがない場合、y値を使用してそのような行を表示することをお勧めします。

table3.idUNIQUEである必要があります。そうでない場合は、各LEFT JOINからの複数の一致で行を乗算できます。

35

テーブルを数回結合する場合は、エイリアスを使用してそれらを区別します。

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=...
8
nosid
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'
3
RedFilter