为什么我得到 "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.
知道这里出了什么问题吗?我该如何解决?谢谢
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
子句中的列的任何人,请将函数的 LANGUAGE
从 plpgsql
到 sql
(并根据该更改调整查询)删除了此“功能”。
在我的具体情况下,冲突是在 INSERT
之后 RETURNING
上的列的明确命名
我想要一个在 plpgsql
期间也能工作的解决方案,但还没有找到。
此查询在 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.
知道这里出了什么问题吗?我该如何解决?谢谢
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
子句中的列的任何人,请将函数的 LANGUAGE
从 plpgsql
到 sql
(并根据该更改调整查询)删除了此“功能”。
在我的具体情况下,冲突是在 INSERT
RETURNING
上的列的明确命名
我想要一个在 plpgsql
期间也能工作的解决方案,但还没有找到。