gpt4 book ai didi

postgresql - Postgres : Query with multiple (partially) overlapping data sources

转载 作者:行者123 更新时间:2023-11-29 13:18:58 25 4
gpt4 key购买 nike

我有多个数据源(目前有 4 个,理论上将来可能会增加)输入到多个 PostgreSQL 表中,我想创建一个 View 来比较每个条目的不同来源。不幸的是,并非所有条目都出现在每个表中

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

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

所以我的问题是:有没有一种方法可以构造连接以在选择/ 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

最佳答案

您的示例查询可以简化:

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 .

关于postgresql - Postgres : Query with multiple (partially) overlapping data sources,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45037490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com