我尝试了以下选择:
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
,它也有效。
有什么建议吗?
您需要在
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;
我想你的p2vg表也有一个id字段,在这种情况下,postgres无法找到
SELECT
中的id是否指的是vg或p2vg。
你应该使用
SELECT(vg.id,vg.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;
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;
作为补充说明:当我使用 CTE 进行连接导致歧义时,我收到此错误。我在
FROM
中使用带有别名的 CTE,尽管使用 CTE 别名为 SELECT
ed 列添加前缀,postgres 仍然会在带前缀的列调用上产生此错误。由于我的查询很长,所以发现起来有点困难。
希望它能帮助那里的人。
我创建了
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)