我有一个表,我在其中转储了来自不同来源(x,y,z)的所有记录,如下所示:
+----+------+--------+
| id | source |
+----+--------+
| 1 | x |
| 2 | y |
| 3 | x |
| 4 | x |
| 5 | y |
| 6 | z |
| 7 | z |
| 8 | x |
| 9 | z |
| 10 | z |
+----+--------+
然后我有一个映射表,其中根据以下用例在源之间映射值
+----+-----------+
| id | mapped_id |
+----+-----------+
| 1 | 2 |
| 1 | 9 |
| 3 | 7 |
| 4 | 10 |
| 5 | 1 |
+----+-----------+
我想要合并的结果,这样我只能看到类似的唯一结果
+-----+------------+
| id | mapped_ids |
+-----+------------+
| 1 | 2,9,5 |
| 3 | 7 |
| 4 | 10 |
| 6 | null |
| 8 | null |
+-----+------------+
我正在尝试其他选项,但无法弄清楚,可以通过编写联接来做到这一点。我必须使用存储关联的映射表,并标识唯一的记录以及未映射到任何地方的记录。
答案 0 :(得分:0)
尝试这样的事情:
SELECT id, name, ARRAY_AGG(mapped_id) AS mapped_ids
FROM table1 AS t1
LEFT JOIN table2 AS t2 USING (id)
GROUP BY id, name
答案 1 :(得分:0)
我的理解是,您希望查看没有出现在mapping_id列中的所有dump_table ID,然后将剩下的ID汇总到其中:
select d1.id,
array_agg(m1.mapped_id order by m1.mapped_id) filter (where m1.mapped_id is not null) as mapped_ids
from dump_table d1
left join mapping_table m1 using (id)
where not exists (select *
from mapping_table m2
where m2.mapped_id = d1.id)
group by d1.id;