Sql <;列>;两个表之间的列比较不明确
我希望此postgres功能正常工作:Sql <;列>;两个表之间的列比较不明确,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,我希望此postgres功能正常工作: CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results() returns table(match_id BIGINT) as $$ BEGIN return QUERY SELECT * FROM sports.match_history WHERE match_id NOT IN (SELE
CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results()
returns table(match_id BIGINT)
as
$$
BEGIN
return QUERY
SELECT *
FROM sports.match_history
WHERE match_id NOT IN (SELECT match_id
FROM sports.match_results);
END $$
LANGUAGE 'plpgsql';
此独立查询工作正常:
SELECT *
FROM sports.match_history
WHERE match_id NOT IN (SELECT match_id FROM sports.match_results);
但是当我把它放到这个函数中并试着像这样运行它时:
select *
from difference_of_match_ids_in_match_history_and_match_results();
我明白了:
SQL错误[42702]:错误:列引用“match_id”不明确细节:它可以引用PL/pgSQL变量或表 专栏。其中:PL/pgSQL函数 第3行中的匹配历史和匹配结果中的匹配ID的差异 返回查询 我也看到过其他有同样错误的问题,他们建议命名子查询以指定您所引用的列的哪个实例,但是,这些示例使用联接,我的查询在函数之外运行良好 如果我确实需要为列命名,那么如何只使用一个子查询
如果这不是问题所在,那么我假设我定义函数的方式有问题 您的查询很好。歧义出现在
返回表(match\u id BIGINT)
中的match\u id
上,在查询中重命名它或在列前面加上表名
CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results()
returns table(new_name BIGINT)
as
$$
BEGIN
return QUERY
SELECT *
FROM sports.match_history
WHERE match_id NOT IN (SELECT match_id
FROM sports.match_results);
END $$
LANGUAGE 'plpgsql';
或
没有测试代码。您的查询没有问题。歧义出现在
返回表(match\u id BIGINT)
中的match\u id
上,在查询中重命名它或在列前面加上表名
CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results()
returns table(new_name BIGINT)
as
$$
BEGIN
return QUERY
SELECT *
FROM sports.match_history
WHERE match_id NOT IN (SELECT match_id
FROM sports.match_results);
END $$
LANGUAGE 'plpgsql';
或
未测试代码。结果集的结构必须与函数结果类型匹配。如果只想获取
匹配\u id
:
CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results()
RETURNS TABLE(m_id BIGINT) -- !!
AS
$$
BEGIN
RETURN QUERY
SELECT match_id -- !!
FROM sports.match_history
WHERE match_id NOT IN (SELECT match_id
FROM sports.match_results);
END $$
LANGUAGE 'plpgsql';
如果希望得到整行结果,请执行以下操作:
DROP FUNCTION difference_of_match_ids_in_match_history_and_match_results();
CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results()
RETURNS SETOF sports.match_history -- !!
AS
$$
BEGIN
RETURN QUERY
SELECT * -- !!
FROM sports.match_history
WHERE match_id NOT IN (SELECT match_id
FROM sports.match_results);
END $$
LANGUAGE 'plpgsql';
结果集的结构必须与函数结果类型匹配。如果只想获取
匹配\u id
:
CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results()
RETURNS TABLE(m_id BIGINT) -- !!
AS
$$
BEGIN
RETURN QUERY
SELECT match_id -- !!
FROM sports.match_history
WHERE match_id NOT IN (SELECT match_id
FROM sports.match_results);
END $$
LANGUAGE 'plpgsql';
如果希望得到整行结果,请执行以下操作:
DROP FUNCTION difference_of_match_ids_in_match_history_and_match_results();
CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results()
RETURNS SETOF sports.match_history -- !!
AS
$$
BEGIN
RETURN QUERY
SELECT * -- !!
FROM sports.match_history
WHERE match_id NOT IN (SELECT match_id
FROM sports.match_results);
END $$
LANGUAGE 'plpgsql';
正如其他人所回答的,结果定义和PL/pgSQL变量之间存在歧义。集合返回函数中的列名实际上也是函数中的一个变量 但首先,您不需要PL/pgSQL来实现这一点。如果使用普通SQL函数,效率会更高,问题也会消失:
CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results()
returns table(match_id BIGINT)
as
$$
SELECT match_id --<< do not return * - only return one column
FROM sports.match_history
WHERE match_id NOT IN (SELECT match_id
FROM sports.match_results);
$$
LANGUAGE sql;
创建或替换\u match\u history\u和\u match\u results()中的\u match\u id\u的函数差异\u
返回表(匹配id BIGINT)
作为
$$
选择match_id--正如其他人所回答的,结果定义和PL/pgSQL变量之间存在歧义。集合返回函数中的列名实际上也是函数中的一个变量
但首先,您不需要PL/pgSQL来实现这一点。如果使用普通SQL函数,效率会更高,问题也会消失:
CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results()
returns table(match_id BIGINT)
as
$$
SELECT match_id --<< do not return * - only return one column
FROM sports.match_history
WHERE match_id NOT IN (SELECT match_id
FROM sports.match_results);
$$
LANGUAGE sql;
创建或替换\u match\u history\u和\u match\u results()中的\u match\u id\u的函数差异\u
返回表(匹配id BIGINT)
作为
$$
选择match_id--列名和plpgsqlOUT
参数之间的命名冲突已解决。详情如下:
我还将使用不同的查询样式<代码>不在(选择…
通常是最慢的,带有空值的陷阱。改用不存在:
SELECT match_id
FROM sports.match_history h
WHERE NOT EXISTS (
SELECT match_id
FROM sports.match_results
WHERE match_id = h.match_id
);
更多:
列名和plpgsqlOUT
参数之间的命名冲突已经解决。详情如下:
我也会使用不同的查询样式<代码>不在(选择…
通常是最慢的,带有空值的陷阱。改用不存在:
SELECT match_id
FROM sports.match_history h
WHERE NOT EXISTS (
SELECT match_id
FROM sports.match_results
WHERE match_id = h.match_id
);
更多:
现在可以工作了。谢谢现在工作。谢谢