我有多个数据源(目前理论上可以增加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
答案 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_*
的所需名称。
了解USING
条款here。