列引用对于函数中的局部变量不明确
Column reference is ambiguous for local variable in function
以下是我的函数
CREATE OR REPLACE FUNCTION add_config_to_enterprise(configKey character varying, enterpriseValue character varying) RETURNS void AS
$BODY$
DECLARE
entId character varying;
BEGIN
FOR entId IN
SELECT enterprise_id
FROM tenant
LOOP
INSERT INTO enterprise_configuration(enterprise_configuration_id, product_configuration_id, enterprise_id, value)
SELECT *
FROM
(SELECT uuid_generate_v4(),
(SELECT pc.product_configuration_id
FROM product_configuration pc
WHERE pc.configuration_key = configKey),
entId, enterpriseValue) AS tmp
WHERE NOT EXISTS
(SELECT e.enterprise_configuration_id
FROM enterprise_configuration e
WHERE e.enterprise_id = entId AND e.product_configuration_id =
(SELECT p.product_configuration_id
FROM product_configuration p
WHERE p.configuration_key = configKey));
END LOOP;
END;
$BODY$ LANGUAGE 'plpgsql'
但是在调用这个函数时出现以下错误
ERROR: column reference "entid" is ambiguous
LINE 12: WHERE e.enterprise_id = entId AND e.product_conf...
^
DETAIL: It could refer to either a PL/pgSQL variable or a table column.
任何 table 中都不存在名为 entid
的列。为什么会报这样的错误?
在WHERE
条件中使用子查询别名:
...
SELECT *
FROM
(SELECT uuid_generate_v4(),
(SELECT pc.product_configuration_id
FROM product_configuration pc
WHERE pc.configuration_key = configKey),
entId, enterpriseValue) AS tmp
WHERE NOT EXISTS
(SELECT e.enterprise_configuration_id
FROM enterprise_configuration e
WHERE e.enterprise_id = tmp.entId AND e.product_configuration_id = -- here
(SELECT p.product_configuration_id
FROM product_configuration p
WHERE p.configuration_key = configKey));
...
或在子查询的SELECT
列表中重命名entId
:
...
SELECT *
FROM
(SELECT uuid_generate_v4(),
(SELECT pc.product_configuration_id
FROM product_configuration pc
WHERE pc.configuration_key = configKey),
entId as eId, enterpriseValue) AS tmp -- here
WHERE NOT EXISTS
(SELECT e.enterprise_configuration_id
FROM enterprise_configuration e
WHERE e.enterprise_id = entId AND e.product_configuration_id =
(SELECT p.product_configuration_id
FROM product_configuration p
WHERE p.configuration_key = configKey));
...
问题是您在查询中定义的别名 tmp
的子查询有一个名为 entid
的列,因此解析器不知道是否引用了 entid
在 WHERE
条件中引用该列或函数变量。
确实,它们包含相同的值,所以在现实中没有关系,但仍然存在句法歧义。
您必须使用别名 tmp
或函数名称 add_config_to_enterprise
来限定 WHERE
条件中的 entid
以解决歧义.
您的查询不必要地复杂且缩进错误,以至于我无法理解和改进它。简化它可以解决这个问题。
以下是我的函数
CREATE OR REPLACE FUNCTION add_config_to_enterprise(configKey character varying, enterpriseValue character varying) RETURNS void AS
$BODY$
DECLARE
entId character varying;
BEGIN
FOR entId IN
SELECT enterprise_id
FROM tenant
LOOP
INSERT INTO enterprise_configuration(enterprise_configuration_id, product_configuration_id, enterprise_id, value)
SELECT *
FROM
(SELECT uuid_generate_v4(),
(SELECT pc.product_configuration_id
FROM product_configuration pc
WHERE pc.configuration_key = configKey),
entId, enterpriseValue) AS tmp
WHERE NOT EXISTS
(SELECT e.enterprise_configuration_id
FROM enterprise_configuration e
WHERE e.enterprise_id = entId AND e.product_configuration_id =
(SELECT p.product_configuration_id
FROM product_configuration p
WHERE p.configuration_key = configKey));
END LOOP;
END;
$BODY$ LANGUAGE 'plpgsql'
但是在调用这个函数时出现以下错误
ERROR: column reference "entid" is ambiguous
LINE 12: WHERE e.enterprise_id = entId AND e.product_conf...
^
DETAIL: It could refer to either a PL/pgSQL variable or a table column.
任何 table 中都不存在名为 entid
的列。为什么会报这样的错误?
在WHERE
条件中使用子查询别名:
...
SELECT *
FROM
(SELECT uuid_generate_v4(),
(SELECT pc.product_configuration_id
FROM product_configuration pc
WHERE pc.configuration_key = configKey),
entId, enterpriseValue) AS tmp
WHERE NOT EXISTS
(SELECT e.enterprise_configuration_id
FROM enterprise_configuration e
WHERE e.enterprise_id = tmp.entId AND e.product_configuration_id = -- here
(SELECT p.product_configuration_id
FROM product_configuration p
WHERE p.configuration_key = configKey));
...
或在子查询的SELECT
列表中重命名entId
:
...
SELECT *
FROM
(SELECT uuid_generate_v4(),
(SELECT pc.product_configuration_id
FROM product_configuration pc
WHERE pc.configuration_key = configKey),
entId as eId, enterpriseValue) AS tmp -- here
WHERE NOT EXISTS
(SELECT e.enterprise_configuration_id
FROM enterprise_configuration e
WHERE e.enterprise_id = entId AND e.product_configuration_id =
(SELECT p.product_configuration_id
FROM product_configuration p
WHERE p.configuration_key = configKey));
...
问题是您在查询中定义的别名 tmp
的子查询有一个名为 entid
的列,因此解析器不知道是否引用了 entid
在 WHERE
条件中引用该列或函数变量。
确实,它们包含相同的值,所以在现实中没有关系,但仍然存在句法歧义。
您必须使用别名 tmp
或函数名称 add_config_to_enterprise
来限定 WHERE
条件中的 entid
以解决歧义.
您的查询不必要地复杂且缩进错误,以至于我无法理解和改进它。简化它可以解决这个问题。