为什么我得到“列引用***含糊不清”?

时间:2017-05-19 16:40:57

标签: 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;

返回:
enter image description here

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

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.

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

3 个答案:

答案 0 :(得分:3)

来自the documentation

  

36.4.9。 SQL函数返回表

     

还有另一种方法可以将函数声明为返回一个集合   是使用语法RETURNS TABLE(columns)。这相当于   使用一个或多个OUT参数并将该功能标记为   返回SETOF记录(或SETOF单个输出参数'类型,如   适当)。此表示法在SQL的最新版本中指定   标准,因此可能比使用SETOF更便携。

这意味着当您使用RETURNS TABLE(jobnr character varying...声明该函数时,jobnr是一个out参数。因此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$

答案 1 :(得分:1)

可能是bug混淆了返回的clausule

 RETURNS TABLE(jobnr character varying, ordernr character varying)

带参数声明。

我知道jobnr不是参数(它是返回记录集的列名)。但是,对于Postgres来说,这个问题很困惑。

RETURNS clausule

中使用其他名称进行尝试

不是错误,它是一个功能

@Andreas是对的!但这是一个无意义的功能。

答案 2 :(得分:0)

对于像我一样没有选择使用表标识符来区分列和 RETURNS 子句中的列的人,将函数的 LANGUAGEplpgsql 切换到 { {1}}(并根据该更改调整查询)删除了此“功能”。

在我的特定情况下,冲突在于 sql 上的列在 RETURNING 之后的明确命名

我想要一个在 INSERT 期间有效但尚未找到的解决方案。