【问题标题】:Recursive self query in Postgres/PADB without CTEs没有 CTE 的 Postgres/PADB 中的递归自查询
【发布时间】:2015-10-29 17:18:31
【问题描述】:

我正在使用缺少递归 CTE 的 PADB/Postgres。我正在尝试找到一种仅使用常规连接/联合而不使用递归 CTE 来编写递归自连接的方法。最简单的方法是什么?

我有一张这样的桌子:

PersonID | Initials | ParentID
1          CJ         NULL
2          EB         1
3          MB         1
4          SW         2
5          YT         NULL
6          IS         5

而且我希望能够获取仅与从特定人员开始的层次结构相关的记录。所以如果我通过 PersonID=1 请求 CJ 的层次结构,我会得到:

PersonID | Initials | ParentID
1          CJ         NULL
2          EB         1
3          MB         1
4          SW         2

对于 EB,我会得到:

PersonID | Initials | ParentID
2          EB         1
4          SW         2

【问题讨论】:

  • 这是什么 PADB 东西?
  • 这是actian (actian.com) 的产品,应该处理大数据。它基于 Postgres sql 的一个版本,但缺少一些特性。
  • 您应该提供有关您的问题的更多信息,而不是在不发表评论的情况下对答案投反对票。例如根本没有规定不能使用过程或函数

标签: sql postgresql recursive-query self-join


【解决方案1】:

这是我能想到的最简单的解决方案。

select * from t where personid = '1' --needs replacement with personid you run for
union
select * from t where personid in (select personid from t where parentid = '1')
or parentid in (select personid from t where parentid = '1')

personid 需要替换为您需要查看其层次结构的人。

SQL 小提琴:http://sqlfiddle.com/#!15/f1201/1

【讨论】:

  • 它涵盖了 3 个级别,但是如果您有第 4 个级别,它将无法工作。例如,如果您在表中添加第 7 行 PersonID = 7, Inistials = 'AA', ParentID = 4
猜你喜欢
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
相关资源
最近更新 更多