当前位置: 首页 > 知识库问答 >
问题:

当使用表名限定时,Postgres列引用不明确

昌砚
2023-03-14

这是一个中等复杂的CTE,它根据JSON参数的内容更新许多表。执行此函数时,Postgres抛出一个列引用“explode”是不明确的错误。错误所指的行实际上有一个表名来限定列引用。

我很确定我是对的,因为如果我删除下面标记的行,错误就会消失。

我一直在想这个问题,但我不知道。

CREATE OR REPLACE FUNCTION prd.update_composition (json, OUT result json) AS
$$
BEGIN
  -- Update and return the new composition
  WITH composition AS (
    UPDATE prd.composition SET (
      explode
    ) = (
      payload_composition.explode
    )
    FROM json_to_record($1) AS payload_composition (
      id      integer,
      explode boolean
    )
    WHERE id IS NOT NULL
    RETURNING *
  ), payload_component AS (
    SELECT
      composition.composition_id,
      component."productId" AS product_id,
      component.quantity,
      component.removed
    FROM json_to_recordset($1->'components') AS component (
      "productId" integer,
      quantity    numeric(10,3),
      removed     boolean
    )
    CROSS JOIN composition
  ), updated_component AS (
    UPDATE prd.component existing SET (
      product_id,
      quantity
    ) = (
      component.product_id,
      component.quantity
    )
    FROM (
      SELECT
        composition_id,
        product_id,
        quantity
      FROM payload_component
      WHERE removed IS NOT TRUE
    ) component
    WHERE existing.composition_id = component.composition_id
    RETURNING *
  ), deleted AS (
    DELETE FROM prd.component existing
    USING (
      SELECT
        composition_id,
        product_id
      FROM payload_component
      WHERE removed IS TRUE
    ) payload_deleted
    WHERE existing.composition_id = payload_deleted.composition_id
      AND existing.product_id = payload_deleted.product_id
  )
  SELECT json_strip_nulls(to_json(r)) INTO result
  FROM (
    SELECT
      composition.composition_id,
      composition.explode -- HERE IS THE OFFENDING LINE --
    FROM composition
  ) r;
END
$$
LANGUAGE 'plpgsql' SECURITY DEFINER;

为什么此代码存在不明确的列引用错误

共有1个答案

单耘豪
2023-03-14

问题在于组合CTE中的返回子句。

通过使用*withPREURning,它返回from_list中所有表的所有列。

返回子句应该指定要返回哪些列和从哪些表返回,特别是如果from_list中有多个表。

在这种情况下,应在插入中使用别名来引用所需的列:

WITH composition AS (
    UPDATE prd.composition c SET ( -- See here
      explode
    ) = (
      payload_composition.explode
    )
    FROM json_to_record($1) AS payload_composition (
      id      integer,
      explode boolean
    )
    WHERE id IS NOT NULL
    RETURNING c.* -- and here
  )
 类似资料:
  • 让我们考虑下面的PoxGrES查询: 当我删除周围的引号时,查询无法正确响应,但当我删除周围的引号时,查询就不能正确响应了。为什么?在这种情况下,正确的查询编写方法是什么,布尔列周围没有引号,文本列周围没有引号?还有别的吗?

  • 我在连接两个表时遇到了一些问题: 组:group_id,group_name 学生:学生标识,组标识,名字,姓氏 我想计算每个小组有多少学生,然后输出小组名称,但是当我这样写时: 出现错误“列引用”groupid“不明确”。

  • 问题内容: 我正在使用jOOQ和一个临时表: 这使我可以编写简单的查询:DSL.select(TYPE,TOKEN).from(TMP)… 但是,当我尝试针对另一个表进行联接时,由于列名并且不具有表名的限制(即,我需要生成的代码看起来像),这会造成歧义。是否可以通过使Jooq理解temp表具有某些列,或通过使用具有限定名称的a来实现此目的? 当然,对于查询的这些部分,我总是可以使用原始SQL,这是

  • 问题内容: 我有一张表,其中有一个名为的整数列。我在该列上有一个索引。 但是似乎Postgres不想使用我的索引: 知道为什么会这样吗? 问题答案: 因为: 您选择的行太多了,以至于读取整个表都比较便宜。

  • 问题内容: 考虑以下病理示例: 在构造函数中创建的两个实例属于嵌套类。 但是,我怎么能指称我们在同一个班级中都知道和喜欢的东西呢?我们不能导入它,也不能使用完全限定的名称,因为将使用嵌套的类符号。 在这种情况下我们该怎么办?(除了显而易见的以外-停止对嵌套类使用此类肆意的邪恶名称)。 问题答案: 如果您完成了以下两项操作,则不能再直接引用: 在作用域中使用静态嵌套类隐藏简单名称。 使用嵌套在cla

  • 问题内容: 我正在使用一个框架(Jodd),该框架将表别名添加到SQL Select的列名称中。它看起来像格式正确的SQL,但Postgres对此感到窒息。 给出一个错误: 有没有办法让Postgres接受该SQL?我的另一种选择是破解框架,我不想这么做。 问题答案: 问题是您在列中的子句中包含了表别名。请参阅Postgres docs中的文档 : 中的列名称 。如果需要,可以使用子字段名称或数组