sql—在cte中使用另一个表中不存在的列

enyaitl3  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(282)

我刚开始编写递归查询,我正在尝试编写我的第一个。我试图确定公司层次结构的级别,并使结果表包含两列—顾问id和由递归查询确定的级别。在cte中,我不知道如何引用“level”,因为它是一个表中还不存在的列。我做错什么了?

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;
gg0vcinb

gg0vcinb1#

我想你想要:

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表表达式的声明只是枚举列名(那里不应该出现表前缀)。
这个 level 初始设置为 0 ,然后可以在每次迭代时通过引用相应的公共表表达式列来增加它。
双方的疑问 UNION ALL 必须返回具有相应数据类型的相同列计数(对应于cte的声明)。

相关问题