Postgresssql高级加入

时间:2017-03-23 13:40:47

标签: postgresql

我是postgresssql的新手。 我有两张这样的表

表A

id      |value  | type1  | type2  | type3
bigint  |text   | bigint | bigint | bigint

表B

Id      | description
bigint  | text  

表A< type1,type2,type3是表B的ID,但是不是外键约束。

我必须像这样检索

Select a.id,
       a.value,
       b.description1(as of a.type1),
       b.description1(as of a.type1),
       b.description1(as of a.type1)

2 个答案:

答案 0 :(得分:1)

如果您需要多列,则应考虑更改数据库设计

表A

   id   | value        
    1   | <something>
    2   | <something>   

TableAType

    id  | TableA.id | type_id | typeValue
     1  |     1     | type1   | bigint
     2  |     1     | type2   | bigint
     3  |     1     | type3   | bigint
           .....
     4  |     1     | typeN   | bigint

TableB(type_description)

Id      | description
bigint  | text  

然后,您的查询变得更加简单,并且在添加/删除类型时不会受到影响。

SELECT TB.Description, TT.TypeValue
FROM TableAType TT
JOIN TableB     TB
  ON TT.Type_id = TB.id

然后您可以使用PIVOT获取表格数据。再一个优点是你可以删除删除类型,并且你的查询没有改变,只需要更新类型表。

答案 1 :(得分:0)

你应该(LEFT)JOIN tableB 3次,并为每一个使用不同的别名。

select id, value, 
           type1, t1.description descri1, 
           type2, t2.description descri2,
           type3, t3.description descri3
from       tableA ta
left  join tableB t1
on         ta.type1 = t1.id 
left  join tableB t2
on         ta.type2 = t2.id 
left  join tableB t3
on         ta.type3 = t3.id;