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:“ - ”是一个值!
我想到了一个完整的外部联接,但是手册中的参考资料令我觉得无法完美地完成它...
谢谢,伙计!
答案 0 :(得分:4)
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;