连接表两次 - 在同一个表的两个不同列上

Red*_*Red 17 sql postgresql join foreign-keys left-join

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

Table1
- id

Table2
- id
- table1_id
- table3_id_1
- table3_id_2

Table3
- id
- value
Run Code Online (Sandbox Code Playgroud)

我需要从table1开始并进行一个连接,它会从table3两个单独的列中返回值.所以我想要这样的东西:

table1.id | table2.id | table2.table3_id_1 | table2.table3_id_2 | X | Y
Run Code Online (Sandbox Code Playgroud)

其中X和Y是由连接该行的值table3_id_1和table3_id_2分别.

可能使它们成为变量或其他东西,所以我也可以在WHERE子句中过滤它们?

Erw*_*ter 35

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;
Run Code Online (Sandbox Code Playgroud)

没有必要涉及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:


nos*_*sid 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=...
Run Code Online (Sandbox Code Playgroud)