20

我有一个非常令人困惑的数据库,其中一个表在单独的表中保存了我需要的两个值。这是我的问题:

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_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;

没有必要参与table1table2拥有你所需要的一切——假设有一个外键约束保证参照完整性(所有t2.table1_id这些实际上都存在于 中table1)。否则,您可能想要加入table1,从而仅选择也存在于 中的行table1

出于类似的原因,我使用LEFT [OUTER] JOIN(而不是[INNER] JOIN加入两个实例table3:目前尚不清楚是否保证了引用完整性 - 以及是否有任何关键列可以是NULL. An[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 回答