Postgres:使用多个(部分)重叠数据源进行查询

时间:2017-07-11 14:31:01

标签: postgresql

我有多个数据源(目前理论上可以增加4个),可以输入多个PostgreSQL表,并希望创建一个比较每个条目的不同来源的视图。不幸的是,并非所有条目都出现在每个表格中

目前我正在使用的查询格式如下

select [relevant_fields] from ((tableA full outer join tableB on 
    tableA.id=tableB.id) full outer join tableC on tableA.id=tableC.id)
    full outer join tableD on tableD.id=tableA.id 

此查询的问题是,如果条目在表B,C和D中但在表A中没有,则它将变为3(大多数为空)行,每个数据源对应一行。我意识到有一种方法可以通过插入二级表来实现这一点,但是想知道是否有任何方法可以直接在select / view中执行此操作,因为这些表中的一些非常大而且只会变大,我宁愿因为我存储了每个记录的多个副本,因此不会遇到内存问题。

所以我的问题是:有没有办法在select / view中为每个条目构建连接以完成1(尽可能填写)行?

编辑,示例数​​据:

Table A
id | value
1  | a
2  | b
3  | c

Table B
id | value
1  | A
3  | Z

Table C
id | value
1  | Q
4  | D

Table D
id | value
1  | a
3  | C

Result
id | val_A | val_B | val_C | val_D
1  |  a    |  A    |  Q    |  a  
2  |  b    |  null |  null |  null
3  |  c    |  Z    |  null |  C
4  |  null |  null |  D    |  null

1 个答案:

答案 0 :(得分:1)

您的示例查询可以简化:

select [relevant_fields]
from
  tableA full join 
  tableB using(id) full join
  tableC using(id) full join
  tableD using(id);

它应该可以随心所欲地工作。

在这种情况下,如果引用的字段具有不同的名称,您可以使用表别名重命名它们,如下所示:

select [relevant_fields]
from
  tableA as tableA(i,val_a) full join 
  tableB as tableB(i,val_b) using(i) full join
  tableC as tableC(i,val_c) using(i) full join
  tableD as tableD(i,val_d) using(i);

它还会生成列val_*的所需名称。

Example

了解USING条款here