有很多表的Postgres上的JOIN解决方案

时间:2014-03-26 19:00:14

标签: sql database postgresql

Postgres数据库上的小问题,在Acqua Data Studio中管理:

我需要一个解决方案来创建一个SELECT,将许多视图连接到一个表中。有超过10个视图。 一个中心可能有许多ID,一个ID可能有许多中心。因此,主表的PK将是中心ID。

适用的一个示例(假设只存在3个表),如下所示:

VIEW1:

 central   |   ID   |    MAP
--------------------------------
    A      |   01   |    MAP1      
    A      |   02   |    MAP1
    A      |   03   |     -
    B      |   01   |    MAP3
    B      |   02   |     -
    C      |   01   |     -

视图2:

 central   |   ID   |    CAMEL
--------------------------------
    A      |   01   |    CAP1
    B      |   01   |    CAP1
    B      |   02   |    CAP2
    B      |   03   |    CAP3
    D      |   01   |     -  

VIEW3:

 central   |   ID   |    NRRG
--------------------------------
    A      |   01   |   NRRG2
    B      |   01   |     -
    C      |   01   |     -
    D      |   05   |   NRRG1

。 。

结果表:

 central   |   ID   |    MAP    |  CAMEL  |  NRRG
--------------------------------------------------
    A      |   01   |    MAP1   |   CAP1  |  NRRG2
    A      |   02   |    MAP1   |         |  
    A      |   03   |     -     |         |
    B      |   01   |    MAP3   |   CAP1  |    -
    B      |   02   |     -     |   CAP2  |
    B      |   03   |           |   CAP3  |
    C      |   01   |     -     |         |    -
    D      |   01   |           |    -    |
    D      |   05   |           |         |  NRRG1

在10个以上表格中的任何一个中出现的任何中央ID都需要输入连接表格 我当然不关心那些没有对应其他列的列的空格... 重要的是在每个ID中心行中获取其他表中存在的每个对应值。 PS:“ - ”是一个值!

我想到了一个完整的外部联接,但是手册中的参考资料令我觉得无法完美地完成它...

谢谢,伙计!

2 个答案:

答案 0 :(得分:4)

SQL Fiddle

select central, id, map, camel, nrrg
from
    v1
    full outer join
    v2 using (central, id)
    full outer join
    v3 using (central, id)
order by central, id
;
 central | id | map  | camel | nrrg  
---------+----+------+-------+-------
 A       |  1 | MAP1 | CAP1  | NRRG2
 A       |  2 | MAP1 |       | 
 A       |  3 |      |       | 
 B       |  1 | MAP3 | CAP1  | 
 B       |  2 |      | CAP2  | 
 B       |  3 |      | CAP3  | 
 C       |  1 |      |       | 
 D       |  1 |      |       | 
 D       |  5 |      |       | NRRG1

答案 1 :(得分:0)

当您拥有复合键时,完全外部联接会更加复杂。相反,请使用union all / group by方法:

select central, id, max(map) as map, max(camel) as camel, max(nrrg) as nrrg
from ((select central, id, map, null as camel, null as nrrg
       from view1
      ) union all
      (select central, id, null as map, camel, null as nrrg
       from view2
      ) union all
      (select central, id, null as map, null as camel, nrrg
       from view3
      )
     ) v
group by central, id;