【问题标题】:Postgres: Query with multiple (partially) overlapping data sourcesPostgres:使用多个(部分)重叠数据源进行查询
【发布时间】:2017-07-11 14:31:01
【问题描述】:

我有多个数据源(目前有 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 行(大部分为空),每个数据源一个。我意识到有一种方法可以通过插入到辅助表中来做到这一点,但想知道是否有任何方法可以直接在选择/视图中执行此操作,因为其中一些表非常大并且只会变得更大,我宁愿不会遇到内存问题,因为我存储了每条记录的多个副本。

所以我的问题是:有没有办法构建连接以在选择/视图中为每个条目完成 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

【问题讨论】:

  • Edit您的问题并添加一些示例数据和基于该数据的预期输出。 Formatted textno screen shotsedit 您的问题 - 请不要在 cmets 中提供邮政编码或其他信息。

标签: postgresql


【解决方案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

【讨论】:

  • 似乎工作正常,之前没有遇到过 USING,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多