別のテーブルに必要な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
ここで、X
とY
は、それぞれtable3_id_1
とtable3_id_2
で接続された行の値です。
おそらく変数または何かにして、WHERE
句でもフィルターできるようにしますか?
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.id
はUNIQUE
である必要があります。そうでない場合は、各LEFT JOIN
からの複数の一致で行を乗算できます。
テーブルを数回結合する場合は、エイリアスを使用してそれらを区別します。
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=...
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'