20

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

Table1
- id

Table2
- id
- table1_id
- table3_id_1
- table3_id_2

Table3
- id
- value

table3table1から移動して、2つの別々の列の値を返す結合を実行する必要があります。だから私はこのようなものが欲しいです:

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

ここXで、およびはそれぞれとでY接続された行の値です。table3_id_1table3_id_2

おそらくそれらを変数か何かにして、WHERE句でそれらをフィルタリングできるようにしますか?

4

3 に答える 3

42
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_idtable1table1table1

同様の理由で、の両方のインスタンスに結合するために使用しますLEFT [OUTER] JOIN(使用しません[INNER] JOINtable3。参照整合性が保証されているかどうか、およびキー列のいずれかを使用できるかどうかは不明ですNULL。一致する[INNER] JOINものが見つからない場合、結果から行が削除されます。NULL欠落しているxまたは。の値を含むそのような行を表示したいと思いますy

table3.idである必要があります。そうUNIQUEでない場合は、行にそれぞれからのいくつかの一致を乗算する可能性がありますLEFT JOIN

于 2012-05-22T21:21:26.370 に答える
9

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

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=...
于 2012-05-22T21:17:46.630 に答える
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'
于 2012-05-22T21:18:52.027 に答える