为什么我得到 "column reference *** is ambiguous"?

Why I am getting "column reference *** is ambiguous"?

此查询在 postgress 上运行良好,returns 我正在寻找的 2 列:

SELECT  w.jobnr, w.ordernr
FROM
    (SELECT jobnr, ordernr FROM userdata.WIP_Data WHERE Year=2015 AND period=1) AS W
    LEFT OUTER JOIN
    (SELECT jobnr, ordernr FROM userdata.WIP_Data WHERE Year=2015 AND period=2) AS P 
    ON W.Jobnr=P.Jobnr;

它returns:

但是当我将此查询包含在如下函数中时:

CREATE OR REPLACE FUNCTION userdata.test3()
 RETURNS TABLE(jobnr character varying, ordernr character varying)
 LANGUAGE plpgsql
AS $function$
BEGIN
    RETURN QUERY
    SELECT  w.jobnr, w.ordernr
    FROM
        (SELECT jobnr, ordernr FROM userdata.WIP_Data WHERE Year=2015 AND period=1) AS W

        LEFT OUTER JOIN
        (SELECT jobnr, ordernr FROM userdata.WIP_Data WHERE Year=2015 AND period=2) AS P 
        ON W.Jobnr=P.Jobnr;
END; 
$function$

并按SELECT * from userdata.test3()执行 我收到以下错误:

ErrorCode: -2147467259
Severity: ERROR, Code: 42702, Line: 1076, Position:
ErrorMessage: column reference "jobnr" is ambiguous
Detail: It could refer to either a PL/pgSQL variable or a table column.

知道这里出了什么问题吗?我该如何解决?谢谢

来自 the documentation

36.4.9. SQL Functions Returning TABLE

There is another way to declare a function as returning a set, which is to use the syntax RETURNS TABLE(columns). This is equivalent to using one or more OUT parameters plus marking the function as returning SETOF record (or SETOF a single output parameter's type, as appropriate). This notation is specified in recent versions of the SQL standard, and thus may be more portable than using SETOF.

这意味着当你用RETURNS TABLE(jobnr character varying...声明函数时,jobnr是一个输出参数。因此 SELECT jobnr ... 是不明确的。

尝试在 select:

中声明带有表别名的函数
CREATE OR REPLACE FUNCTION userdata.test3()
 RETURNS TABLE(jobnr character varying, ordernr character varying)
 LANGUAGE plpgsql
AS $function$
BEGIN
    RETURN QUERY
    SELECT  w.jobnr, w.ordernr
    FROM
        (SELECT wip.jobnr, wip.ordernr FROM userdata.WIP_Data as wip WHERE Year=2015 AND period=1) AS W

        LEFT OUTER JOIN
        (SELECT wip.jobnr, wip.ordernr FROM userdata.WIP_Data as wip WHERE Year=2015 AND period=2) AS P 
        ON W.Jobnr=P.Jobnr;
END; 
$function$

可能是 bug 混淆返回子句

 RETURNS TABLE(jobnr character varying, ordernr character varying)

带有参数声明。

我知道 jobnr 不是参数(它是返回记录集的列名)。但是,Postgres 对此感到困惑。

尝试在 RETURNS 子句中使用其他名称

不是错误,是功能

@Andreas 说的对!但这是一个废话功能。

对于像我一样无法使用 table 标识符来区分列和 RETURNS 子句中的列的任何人,请将函数的 LANGUAGEplpgsqlsql(并根据该更改调整查询)删除了此“功能”。

在我的具体情况下,冲突是在 INSERT

之后 RETURNING 上的列的明确命名

我想要一个在 plpgsql 期间也能工作的解决方案,但还没有找到。