在Postgres函数中使用WITH ... AS(CTE)

时间:2019-07-17 16:11:29

标签: sql postgresql

在以下所有描述中,我都更改了变量,函数和数据集的名称,以使您更轻松地遵循代码。我想做的是创建一个新函数myFx,该函数接受var_a的参数并输出具有3列的表-var_a,var_b和var_c。

下面显示了代码,其中大部分是通用表表达式(CTE),该表使用UNION组合来自三个SELECT语句的行以生成临时表结果t_union。最下面的代码是通过使用t_union并将其自连接到自身而输出我想要的代码的代码。

尽管下面的代码段无需输入功能参数(CREATE或REPLACE FUNCTION ...和RETURNS TABLE ...)即可工作,但是一旦在其中添加了功能参数,就会收到一条错误消息,表明我无法使用与(与t_union)一样。有人可以告诉我这里是什么问题吗?非常感谢!

CREATE OR REPLACE FUNCTION myFx (var_a varchar(2))

RETURNS TABLE (var_a varchar(2),
    var_b character,
    var_c character )

WITH t_union
AS (SELECT x, y, z,
    RANK() OVER (PARTITION BY x ORDER BY (y COLLATE "C") ASC) AS stp_pos
    FROM DATASET1

    UNION ALL 

    SELECT x, y, z,
    RANK() OVER (PARTITION BY x ORDER BY (y COLLATE "C") ASC) AS stp_pos
    FROM DATASET2

    UNION ALL

    SELECT x, y, z,
    RANK() OVER (PARTITION BY x ORDER BY (y COLLATE "C") ASC) AS stp_pos
    FROM DATASET3

SELECT BS.atoc_code, L1.train_uid, L1.stp_indicator, L1.location AS loc1, L2.location AS loc2
    FROM t_union L1 JOIN t_union L2
    ON L1.x=L2.x AND L1.y<L2.y
    JOIN DATASET3 BS ON L1.x=BS.x;

这是我得到的错误代码:

ERROR:  syntax error at or near "WITH"
LINE 9: WITH t_union
        ^
SQL state: 42601
Character: 197

0 个答案:

没有答案