为什么我收到“列引用***不明确”的信息?

WSK*_*WSK 3 postgresql postgresql-9.6

此查询在postgress上运行良好,并返回了我正在寻找的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;
Run Code Online (Sandbox Code Playgroud)

它返回:
在此处输入图片说明

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

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

并通过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.
Run Code Online (Sandbox Code Playgroud)

知道这里有什么问题,我该如何解决?谢谢

And*_*eas 5

文档中

36.4.9。SQL函数返回表

还有一种将函数声明为返回集合的方法,即使用语法RETURNS TABLE(columns)。这等效于使用一个或多个OUT参数,并将功能标记为返回SETOF记录(或SETOF,视情况而定为单个输出参数的类型)。该符号在SQL标准的最新版本中指定,因此比使用SETOF更可移植。

这意味着当您使用声明函数时RETURNS TABLE(jobnr character varying...,它jobnr是一个out参数。因此SELECT jobnr ...是模棱两可的。

尝试使用所选表的别名声明函数:

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