Postgres 9.5查询:获取各事件ID的后继事件列表
解决PostgreSQL 9.5中获取事件后继列表的问题
错误原因分析
你之前的子查询报错是因为(select event_id from event_table)返回了所有事件ID的多行结果,而= ANY运算符需要的是单个值和数组元素做比较,逻辑完全搞反了。正确的逻辑应该是:判断某个事件的ID是否存在于另一个事件的predecessor_list数组中,后者就是前者的后继事件。
正确SQL查询
以下是符合你需求的查询语句,能准确生成每个event_id对应的后继事件列表:
SELECT e.event_id, COALESCE(array_agg(s.event_id ORDER BY s.event_id), '{}'::text[]) AS successors FROM event_table e LEFT JOIN event_table s ON e.event_id = ANY(s.predecessor_list) GROUP BY e.event_id ORDER BY e.event_id;
代码解释
- 左连接(LEFT JOIN):将事件表自连接,关联条件是
e.event_id存在于s.predecessor_list数组中,这样s表的每一行都是e表对应事件的后继事件。 - 数组聚合(array_agg):把每个
e.event_id对应的所有后继事件ID聚合成数组,ORDER BY s.event_id保证数组元素按顺序排列,和你期望的输出一致。 - COALESCE处理空值:对于没有后继的事件(比如
event_id=05),array_agg会返回NULL,用COALESCE将其转换为空数组'{}'::text[]。 - 分组与排序:按
e.event_id分组聚合结果,最后排序保证输出顺序和示例一致。
运行这个查询后,就能得到你期望的输出:
event_id | successors 01 | [02, 03, 04, 05] 02 | [04] 03 | [05] 04 | [05] 05 | []
内容的提问来源于stack exchange,提问作者ShubhamWanne
相关产品推荐
相关产品推荐

