Sql <;列>;两个表之间的列比较不明确

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

我希望此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 (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--列名和plpgsql
OUT
参数之间的命名冲突已解决。详情如下:

我还将使用不同的查询样式<代码>不在(选择…
通常是最慢的,带有空值的陷阱。改用
不存在

SELECT match_id
FROM   sports.match_history h 
WHERE  NOT EXISTS (
   SELECT match_id 
   FROM   sports.match_results
   WHERE  match_id = h.match_id
   );
更多:


列名和plpgsql
OUT
参数之间的命名冲突已经解决。详情如下:

我也会使用不同的查询样式<代码>不在(选择…
通常是最慢的,带有空值的陷阱。改用
不存在

SELECT match_id
FROM   sports.match_history h 
WHERE  NOT EXISTS (
   SELECT match_id 
   FROM   sports.match_results
   WHERE  match_id = h.match_id
   );
更多:


现在可以工作了。谢谢现在工作。谢谢