sql - 与 Oracle 的 CONNECT BY ... START WITH 等效的 PostgreSQL 语法是什么?

标签 sql oracle postgresql recursive-query connect-by

Oracle 中,如果我有一个表定义为......

CREATE TABLE taxonomy
    (
    key NUMBER(11) NOT NULL CONSTRAINT taxPkey PRIMARY KEY,
    value VARCHAR2(255),
    taxHier NUMBER(11)
    );
ALTER TABLE
    taxonomy
ADD CONSTRAINT
    taxTaxFkey
FOREIGN KEY
    (taxHier)
REFERENCES
    tax(key);

有了这些值……

key value   taxHier
0   zero    null
1   one     0
2   two     0
3   three   0
4   four    1
5   five    2
6   six     2

这个查询语法......

SELECT
     value
FROM
    taxonomy
CONNECT BY
    PRIOR key = taxHier
START WITH
    key = 0;

会产生……

zero
one
four
two
five
six
three

这在 PostgreSQL 中是如何完成的?

最佳答案

在 Postgres 中使用 RECURSIVE CTE:

WITH RECURSIVE cte AS (
   SELECT key, value, 1 AS level
   FROM   taxonomy
   WHERE  key = 0

   UNION  ALL
   SELECT t.key, t.value, c.level + 1
   FROM   cte      c
   JOIN   taxonomy t ON t.taxHier = c.key
   )
SELECT value
FROM   cte
ORDER  BY level;

我之前回答中的详细信息和文档链接:

或者您可以安装附加模块tablefunc,它提供函数connectby()。几乎一样。参见 Stradas' answer了解详情。

关于sql - 与 Oracle 的 CONNECT BY ... START WITH 等效的 PostgreSQL 语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24898681/

相关文章:

sql - 从 PostgreSQL 中的数字获取月份名称

sql - ORA-12545: 连接失败,因为目标主机或对象不存在

mysql - 错误 1292 (22007) : Truncated incorrect DOUBLE value: 'JAIN' 的含义

sql - Hive表加入更新

json - 如何在 PL/SQL 中查询非标量 JSON 值

sql - 不能删除系统生成的序列

php - 设置一个日期范围来检索登录的用户,以 1970-01-01 结尾

java - 注册oracle.jdbc.OracleDriver

SQL - min() 获得最低值,max() 获得最高值,如果我想要第二个(或第五个或第 n 个)最低值怎么办?

mysql - 如何同时通过两个不同的子句查询两个字段的计数?