SQL 列引用“id”不明确

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

我尝试了以下选择:

SELECT (id,name) FROM v_groups vg 
inner join people2v_groups p2vg on vg.id = p2vg.v_group_id
where p2vg.people_id =0;

我收到以下错误列参考

id
不明确。

如果我尝试相同的

SELECT
,但我只要求
name
而不是
id
,它也有效。

有什么建议吗?

sql postgresql select
6个回答
134
投票

您需要在

SELECT
部分提供表名称/别名(也许是
(vg.id, name)
):

SELECT (vg.id, name)
FROM v_groups vg 
INNER JOIN people2v_groups p2vg
  ON vg.id = p2vg.v_group_id
WHERE p2vg.people_id = 0;

11
投票

我想你的p2vg表也有一个id字段,在这种情况下,postgres无法找到

SELECT
中的id是否指的是vg或p2vg。

你应该使用

SELECT(vg.id,vg.name)
来消除歧义


6
投票
SELECT (vg.id, name) FROM v_groups vg 
INNER JOIN people2v_groups p2vg ON vg.id = p2vg.v_group_id
WHERE p2vg.people_id = 0;

1
投票
SELECT vg.id, 
       vg.name
  FROM v_groups vg INNER JOIN  
       people2v_groups p2vg ON vg.id = p2vg.v_group_id
 WHERE p2vg.people_id = 0;

1
投票

作为补充说明:当我使用 CTE 进行连接导致歧义时,我收到此错误。我在

FROM
中使用带有别名的 CTE,尽管使用 CTE 别名为
SELECT
ed 列添加前缀,postgres 仍然会在带前缀的列调用上产生此错误。由于我的查询很长,所以发现起来有点困难。

希望它能帮助那里的人。


0
投票

我创建了

person
表,如下所示:

CREATE TABLE person (
  id INTEGER,
  name VARCHAR(20)
);

然后,我创建了

my_func()
,它返回一个表格,如下所示:

CREATE FUNCTION my_func() RETURNS TABLE(id INTEGER, name VARCHAR)
AS $$
BEGIN
  RETURN QUERY SELECT id, name FROM person;
END;        -- ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
$$ LANGUAGE plpgsql;

最后,调用

my_func()
得到了同样的错误,如下所示:

postgres=# SELECT my_func();
ERROR:  column reference "id" is ambiguous
LINE 1: SELECT id, name FROM person
               ^
DETAIL:  It could refer to either a PL/pgSQL variable or a table column.
QUERY:  SELECT id, name FROM person
CONTEXT:  PL/pgSQL function my_func() line 3 at RETURN QUERY

因此,我在

person
.
之前设置了表名称
id
name
,如下所示:

CREATE FUNCTION my_func() RETURNS TABLE(id INTEGER, name VARCHAR(20))
AS $$
BEGIN
  RETURN QUERY SELECT person.id, person.name FROM person;
END;               -- ↑ ↑ ↑ ↑    ↑ ↑ ↑ ↑
$$ LANGUAGE plpgsql;

最后,我可以毫无错误地调用

my_func()
,如下所示。 *从
SELECT 语句
中省略 FROM子句会得到 错误:

postgres=# SELECT my_func();
  my_func
-----------
 (1,John)
 (2,David)
(2 rows)
© www.soinside.com 2019 - 2024. All rights reserved.