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

dac*_*cot 16 sql oracle postgresql connect-by recursive-query

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);
Run Code Online (Sandbox Code Playgroud)

有了这些价值......

key value   taxHier
0   zero    null
1   one     0
2   two     0
3   three   0
4   four    1
5   five    2
6   six     2
Run Code Online (Sandbox Code Playgroud)

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

SELECT
     value
FROM
    taxonomy
CONNECT BY
    PRIOR key = taxHier
START WITH
    key = 0;
Run Code Online (Sandbox Code Playgroud)

会屈服......

zero
one
four
two
five
six
three
Run Code Online (Sandbox Code Playgroud)

如何在PostgreSQL中完成?

Erw*_*ter 27

RECURSIVE CTE在Postgres中使用a :

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;
Run Code Online (Sandbox Code Playgroud)

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


Str*_*das 8

Postgres确实具有与connect by相当的功能.您需要启用该模块.它默认关闭.

它被称为tablefunc.它支持一些很酷的交叉表功能以及熟悉的" connect by "和" Start With ".我发现它比递归CTE更有说服力和逻辑性.如果你的DBA无法启用它,你应该采用Erwin的方式.
它足够强大,可以进行"物料清单"类型查询.

可以通过运行此命令打开Tablefunc:

CREATE EXTENSION tablefunc;
Run Code Online (Sandbox Code Playgroud)

以下是从官方文档中刚刚解除的连接字段列表.

Parameter:         Description
relname:           Name of the source relation (table)
keyid_fld:         Name of the key field
parent_keyid_fld:  Name of the parent-key field
orderby_fld:       Name of the field to order siblings by (optional)
start_with:        Key value of the row to start at
max_depth:         Maximum depth to descend to, or zero for unlimited depth
branch_delim:      String to separate keys with in branch output (optional)
Run Code Online (Sandbox Code Playgroud)

你真的应该看看文档页面.它写得很好,它会为您提供您习惯的选项.(在文档页面向下滚动,靠近底部.)

Postgreql"Connect by"扩展名 下面是将该结构放在一起的描述.有很大的潜力,所以我不会做正义,但这里有一个片段给你一个想法.

connectby(text relname, text keyid_fld, text parent_keyid_fld
          [, text orderby_fld ], text start_with, int max_depth
          [, text branch_delim ])
Run Code Online (Sandbox Code Playgroud)

真正的查询将如下所示.Connectby_tree是表的名称.以"AS"开头的行是您如何命名列.它确实看起来有点颠倒.

SELECT * FROM connectby('connectby_tree', 'keyid', 'parent_keyid', 'pos', 'row2', 0, '~')
    AS t(keyid text, parent_keyid text, level int, branch text, pos int);
Run Code Online (Sandbox Code Playgroud)

  • 如何向查询添加更多列?比方说,我还需要名字和姓氏。 (2认同)