我有一个非常令人困惑的数据库,其中一个表在一个单独的表中包含我需要的两个值。这是我的问题:
Table1
- id
Table2
- id
- table1_id
- table3_id_1
- table3_id_2
Table3
- id
- value
我需要从table1开始并执行一个联接,它会在两个单独的列中返回table3
的值。所以我想要这样的东西:
table1.id | table2.id | table2.table3_id_1 | table2.table3_id_2 | X | Y
其中X
和Y
分别是由table3_id_1
和table3_id_2
连接的行的值。
可能会让它们成为变量或其他东西,所以我也可以在WHERE
子句中过滤它们吗?
答案 0 :(得分:34)
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保证引用完整性(t2.table1_id
中实际存在table1
}。否则,您可能希望加入table1
,从而仅选择table1
中也包含的行。
我使用LEFT [OUTER] JOIN
(and not [INNER] JOIN
)加入table3
的两个实例的原因类似:不清楚参照完整性是否得到保证 - 以及任何关键列是否都可以NULL
。 [INNER] JOIN
将从未找到匹配项的结果中删除行。我假设您希望显示任何缺少NULL
或x
的{{1}}值的行。
y
必须为table3.id
,否则我们可能会将每个UNIQUE
的多个匹配的行相乘:
答案 1 :(得分:8)
如果多次加入表格,请使用别名来区分它们:
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=...
答案 2 :(得分: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'