Postgres:查询循环另一个子查询查询

问题描述 投票:0回答:1

我希望这不是一个重复的问题,我尝试搜索这个问题一个多小时但找不到任何东西。

我正在使用 postgres 9.5,并在处理事件编排流程和以下事件表结构时。我正在尝试编写查询,为每个事件 id 提供后继者列表。

event_id | event_name | predecessor_list

01       | eventA          | []
02       | eventB          | [01]
03       | eventC          | [01]
04       | eventD          | [01, 02]
05       | eventE          | [01, 03, 04]

我尝试使用子查询,

select event_id from event_table et where (select event_id from event_table) = ANY (predecessor_list)

但出现以下异常

ERROR: more than one row returned by a subquery used as an expression

我期望的输出是;

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

我对 postgres 很陌生,也尝试过连接,但没有成功。

如有任何帮助,我们将不胜感激。

谢谢

sql postgresql subquery
1个回答
0
投票

我用你的例子画了一棵树,以更好地理解这个问题。树揭示的一些事情(假设我做得正确)是:-

A) 在事件 04 和 05 中,您不需要存储事件 01,因为在 04 的情况下:02 是 04 的父级,而 01 是 02 的父级,因此隐式捕获了此信息。与事件 05 相同。

B)我不确定您期望的输出是否与树结构匹配。你说你期待

event_id | successors 
02 | [04]

但是由于 05 是 04 的子级,因此发生在 04 之后,应该这样读吗?

event_id | successors
02 | [04] [05]

我怀疑你想要实现的目标在 SQL 中实际上是否可能(使用给定的模型)。我作为 Oracle DBA 的工作时间比我应有的时间长,我可能会对我的客户说不要这样做 - 并花一些时间与他们一起更好地理解模型的业务案例或发现更符合要求的模型。但由于我是 Postgresql 的新手,也许我没有足够的知识来确定在 Postgresql 中是否可能(或不可能)。我看看能找到什么。

© www.soinside.com 2019 - 2024. All rights reserved.