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

问题描述 投票:0回答:3

这个查询在 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;

返回:

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

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.

知道这里出了什么问题以及如何解决它吗?谢谢

postgresql postgresql-9.6
3个回答
11
投票

来自文档

38.5.10。 SQL 函数返回表

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

这意味着当您使用

RETURNS TABLE(jobnr character varying...
声明函数时,
jobnr
是一个输出参数。因此
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$

2
投票

可能是

bug
混淆了返回子句

 RETURNS TABLE(jobnr character varying, ordernr character varying)

带有参数声明。

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

尝试使用

RETURNS
子句中的其他名称

不是错误,而是功能

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


2
投票

对于像我一样无法选择使用表标识符来区分列与

RETURNS
子句中的列的人,请将函数的
LANGUAGE
plpgsql
切换为
sql
(并将查询调整为该更改)删除了这个“功能”。

在我的具体情况下,冲突在于

RETURNING
 之后的 
INSERT

上的列的明确命名

我想要一个在

plpgsql
期间有效的解决方案,但尚未找到。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.