【发布时间】:2021-04-06 16:27:17
【问题描述】:
我有一个相当棘手的数据库问题,真的让我很困惑,不胜感激。
我有一个表格,其中包含来自多个不同来源的数据。这些来自不同来源的数据可能会“重复”,我们有办法确定是否属于这种情况。
表中的每一行都有一个“id”,如果它被识别为另一行的重复,那么我们将它合并,并给它一个“merged_into_id”,它引用同一张表中的另一行。
我正在尝试运行一份报告,该报告将返回有关我们从其中两个不同来源中识别出重复项的信息。
假设我有三个来源:A、B 和 C。我想识别来源 A 和来源 B 之间的所有重复行。
如果源 A 中的一行直接合并到源 B 中,我的查询可以正常工作。但是,我们在数据库中也有源 A 行和源 B 行合并到源 C 中的实例。我我正在努力解决这些问题,并希望有人能提供帮助。
一个例子:
原始数据库:
| id | source | merged_into_id |
|---|---|---|
| 1 | A | 3 |
| 2 | B | 3 |
| 3 | C | NULL |
我想做的是能够从该表中返回 id 1 和 id 2,因为它们都合并到同一个 ID 中,例如像这样:
| source_a_id | source_b_id |
|---|---|
| 1 | 2 |
但我真的很难做到这一点 - 我所做的只是创建一个父子链接,如下所示:
| parent_id | child_id | child_source |
|---|---|---|
| 3 | 1 | A |
| 3 | 2 | B |
我也可以只返回我想要的 ID,但可以说它们不会“加入”: 例如
SELECT
CASE WHEN child_source = 'A' then child_id as source_a_id,
CASE WHEN child_source = 'B' then child_id as source_b_id
但这只是给我一个“缺失”数据的空行响应
---编辑---
使用array_agg 和array_to_string 我已经更接近我的需要了:
SELECT
parent.id as parent_id,
ARRAY_TO_STRING(
ARRAY_AGG(CASE WHEN child_source = 'A' THEN child.id END)
, ','
) a_id,
ARRAY_TO_STRING(
ARRAY_AGG(CASE WHEN child_source = 'B' THEN child.id END)
, ','
) b_id
但它的格式并不完全正确,因为我偶尔会从每个来源获得 多个 版本,所以我得到一个看起来像这样的表格:
| parent_id | a_id | b_id |
|---|---|---|
| 3 | 1 | 2,4,5 |
在这种情况下,我想返回一个如下所示的表:
| parent_id | a_id | b_id |
|---|---|---|
| 3 | 1 | 2 |
| 3 | 1 | 4 |
| 3 | 1 | 5 |
有人对获得我想要的输出有什么建议吗?非常感谢
【问题讨论】:
-
这应该适用于一般数量的骗子吗?换句话说,如果有 (4, D, 3) 的行,答案是否需要自动包含
source_d_id? -
感谢您的回复 - 它确实需要使用通用编号。我已经编辑了这个问题以反映这一点。我也得到了(我认为)更进一步。编辑有帮助吗?干杯!
-
所以如果你在 a 有两个重复,在 b 有 3 个重复,你想显示 6 行吗?
-
是的,没错
标签: postgresql join relationship