1

我是编写递归查询的新手,我正在尝试编写我的第一个查询。我正在尝试确定公司层次结构的级别,并让结果表包含两列 - 顾问 ID 和由递归查询确定的级别。在 CTE 中,我无法弄清楚如何引用“级别”,因为它是表中尚不存在的列。我究竟做错了什么?

WITH consultantsandlevels
    (c."ConsultantDisplayID",
    consultantsandlevels."level"
    )

AS
(

SELECT c."ConsultantDisplayID",
    0

FROM flight_export_consultant AS c

WHERE c."ParentPersonDisplayID" IS NULL

UNION all

SELECT c."ConsultantDisplayID",

    c."ParentPersonDisplayID",

    consultantsandlevels."level" + 1
FROM flight_export_consultant

JOIN consultantsandlevels ON c."ParentPersonDisplayID" = consultantsandlevels."ConsultantDisplayID"
)

SELECT *

FROM consultantsandlevels;
4

1 回答 1

1

我想你想要:

WITH RECURSIVE consultantsandlevels(ConsultantDisplayID, level) AS (
    SELECT "ConsultantDisplayID", 0 
    FROM flight_export_consultant 
    WHERE "ParentPersonDisplayID" IS NULL
    UNION ALL
    SELECT fec."ConsultantDisplayID", cal.level + 1
    FROM flight_export_consultant fec
    INNER JOIN consultantsandlevels cal 
        ON fec."ParentPersonDisplayID" = cal.ConsultantDisplayID
)
SELECT * FROM consultantsandlevels;

理由:

  • WITH子句必须以关键字开头RECURSIVE

  • comon-table-expression 的声明只是枚举列名(那里不应出现表前缀)。

  • level最初设置为,然后0您可以通过引用相应的 common-table-expression 列在每次迭代时递增它。

  • 两侧的查询UNION ALL必须返回具有相应数据类型的相同列数(对应于 cte 的声明)。

于 2020-06-23T20:56:21.657 回答