如何使用WITH子查询更新或插入数据?并避免`PG :: UndefinedTable:错误:缺少表的FROM子句条目错误

问题描述

我正在尝试运行简单的SQL查询:

    <<-SQL.squish
      WITH payloads as (
        INSERT into text_payloads (text,created_at,updated_at)
          SELECT text,updated_at
          FROM text_messages
        RETURNING id,text,updated_at
      )
      UPDATE text_messages
      SET
        payload_id = text_payloads.id,payload_type = 'TextPayload'
      WHERE
        text_messages.text = text_payloads.text AND
        text_messages.created_at = text_payloads.created_at AND
        text_messages.updated_at = text_payloads.updated_at
    SQL

但出现此错误:

PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "text_payloads"
LINE 1: ...d_type = 'TextPayload' WHERE text_messages.text = text_paylo...
                                                         

我已经尝试添加FROM payloads甚至是LEFT OUTER JOIN text_payloads,但没有任何帮助。如何使用WITH子查询及其结果来实现此更新或类似的插入操作?

非常感谢您!

解决方法

错误消息很明显:FROM语句中没有UPDATE子句可以在CTE之间执行联接(我想您想使用CTE而不是 text_payloadstext_messages
正确的语法是:

WITH payloads as (
  INSERT into text_payloads (text,created_at,updated_at)
    SELECT text,updated_at
    FROM text_messages
  RETURNING id,text,updated_at
)
UPDATE text_messages
SET
  payload_id = payloads.id,payload_type = 'TextPayload'
FROM payloads  
WHERE
  text_messages.text = payloads.text AND
  text_messages.created_at = payloads.created_at AND
  text_messages.updated_at = payloads.updated_at 

请参见demo

,

这是工作代码

    <<-SQL.squish
      WITH payloads as (
        INSERT into text_payloads (text,updated_at)
          SELECT text,updated_at
          FROM text_messages
        RETURNING id,updated_at
      )
      UPDATE text_messages
      SET
        payload_id = text_payloads.id,payload_type = 'TextPayload'
      FROM payloads,text_payloads
      WHERE
        text_messages.text = text_payloads.text AND
        text_messages.created_at = text_payloads.created_at AND
        text_messages.updated_at = text_payloads.updated_at
    SQL

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...