【问题标题】:PostgreSQL - Error column reference "id" is ambiguousPostgreSQL - 错误列引用“id”不明确
【发布时间】:2018-01-26 01:39:13
【问题描述】:

我已经为所有内容设置了别名,但如果没有

,似乎无法让这个查询正常工作

错误列引用“id”不明确”

如果我删除其中一个连接似乎可以工作,但我只是对为什么它不能与两个连接工作感到困惑?

create function influence.person_info(user_id integer)
  returns setof influence.person_object as
$$
    declare
    obj influence.person_object;
    begin
        select t1.email as a_email, t2.organisation_url as a_org, t3.first_name as a_first, t3.last_name as a_last into obj
        from influence_private.person_account as t1
        inner join influence_private.organisation_account as t2 on (t1.organisation_id = t2.id)
        inner join influence.person as t3 on (t1.person_id = t3.id)
        where id = $1;
        return next obj;
    end;
$$ LANGUAGE plpgsql stable;

任何指针?

【问题讨论】:

  • 只是一些提示 - 这个函数只返回一行。那么它应该被定义为RETURNS influence.person_object 并且应该使用RETURN 而不是RETURN NEXT。 RETURNS SETOF 可能比 RETURNS 复合慢得多。此外,在您的示例中,行估计可能会严重错误。

标签: postgresql


【解决方案1】:

在您的 where 子句中,您需要明确说明您指的是哪个 id。

【讨论】:

  • 已经解决了。非常感激。有时您只需要第二双眼睛。
【解决方案2】:

如果您检查您的查询:

select t1.email as a_email, ...
from influence_private.person_account as t1
join influence_private.organisation_account as t2 
  on (t1.organisation_id = t2.id)   -- here
join influence.person as t3 
  on (t1.person_id = t3.id)         -- here

您的两个表(influence_private 和 influence)都有名为 id 的列。 Postgresql 不知道你想使用哪一个,所以你必须使用全名,比如t2.id。

【讨论】:

    【解决方案3】:

    您查询的问题是t2 和t3 两个表都有一个名为id 的列。在Where 子句中,id 是模棱两可的,因为它不知道您指的是什么id(t2 或t3)指定它并且它将正常工作。

    修复示例:

    create function influence.person_info(user_id integer)
      returns setof influence.person_object as
    $$
        declare
        obj influence.person_object;
        begin
            select t1.email as a_email, t2.organisation_url as a_org, t3.first_name as a_first, t3.last_name as a_last into obj
            from influence_private.person_account as t1
            inner join influence_private.organisation_account as t2 on (t1.organisation_id = t2.id)
            inner join influence.person as t3 on (t1.person_id = t3.id)
            where t1.id = $1;
            return next obj;
        end;
    $$ LANGUAGE plpgsql stable;
    

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2015-01-07
      • 2018-07-02
      • 2021-01-08
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多