2012-05-22 140 views
11

我有一个非常令人困惑的数据库,其中包含一个表,该表包含我需要在单独的表中存储的两个值。这是我的问题:连接表两次 - 在同一个表的两个不同列上

Table1 
- id 

Table2 
- id 
- table1_id 
- table3_id_1 
- table3_id_2 

Table3 
- id 
- value 

我需要从表1去,做一个连接,会给我带回从table3值在两个单独的列。所以,我想是这样的:

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

XY是分别table3_id_1table3_id_2连接该行的值。

可能使它们变量或东西,所以我可以在WHERE子句中筛选它们吗?

回答

26
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会从未找到匹配的结果中删除行。我假设你宁愿显示NULLxy这样的行。

而且table3.id必须UNIQUE,或者我们可以从每个LEFT JOIN乘以几场比赛行:

7

如果你加入一个表几次,使用别名来区分它们:

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=... 
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' 
相关问题