You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

代码解释

  1. 左连接(LEFT JOIN):将事件表自连接,关联条件是e.event_id存在于s.predecessor_list数组中,这样s表的每一行都是e表对应事件的后继事件。
  2. 数组聚合(array_agg):把每个e.event_id对应的所有后继事件ID聚合成数组,ORDER BY s.event_id保证数组元素按顺序排列,和你期望的输出一致。
  3. COALESCE处理空值:对于没有后继的事件(比如event_id=05),array_agg会返回NULL,用COALESCE将其转换为空数组'{}'::text[]。
  4. 分组与排序:按e.event_id分组聚合结果,最后排序保证输出顺序和示例一致。

运行这个查询后,就能得到你期望的输出:

event_id | successors
01       | [02, 03, 04, 05]
02       | [04]
03       | [05]
04       | [05]
05       | []

内容的提问来源于stack exchange,提问作者ShubhamWanne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:42:08