postgres sql:获取统一的行

时间:2018-12-07 13:43:21

标签: postgresql

我有一个表,我在其中转储了来自不同来源(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       |
+-----+------------+

我正在尝试其他选项,但无法弄清楚,可以通过编写联接来做到这一点。我必须使用存储关联的映射表,并标识唯一的记录以及未映射到任何地方的记录。

2 个答案:

答案 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;

在线示例:https://rextester.com/JQZ17650