首页 > 解决方案 > 使用 WITH 子句的 SQL INSERT/SELECT

问题描述

我正在尝试根据 ID 列表从两个表中创建副本,这些 ID 是从初始表中检索的,然后将这些 ID 用于INSERT SELECT语句,还必须将前一个INSERT中创建的 ID 插入到第三张表:

BEGIN;

WITH dog_tmp AS (SELECT id FROM dog WHERE toy_id = '12345'),
meal_tmp as (INSERT INTO meal (id, dog_id, date_created, type)
    SELECT public.uuid_generate_v4(), dt.id, m.date_created, m.type
    FROM meal AS m
    JOIN dog_tmp dt ON dt.id = m.dog_id RETURNING m.id AS meal_uuid)

INSERT INTO dog_diet (id, meal_id, date_created)
SELECT public.uuid_generate_v4(), mt.meal_uuid, dd.date_created
FROM meal_tmp mt
         JOIN dog_diet dd ON dd.thread_id = mt.meal_uuid;

COMMIT;

我收到此错误:[42P01] 错误:缺少表“m”的 FROM 子句条目

提前感谢您对此的提示,或者如果可能的话,另一种方法。

标签: sqlpostgresqlinsert-select

解决方案


快速回答:更改RETURNING m.id AS meal_uuidRETURNING id AS meal_uuiddb fiddle)。

因此,有争议的完整声明是:

INSERT INTO meal (id, dog_id, date_created, type)
    SELECT public.uuid_generate_v4(), dt.id, m.date_created, m.type
    FROM meal AS m
    JOIN dog_tmp dt ON dt.id = m.dog_id 
RETURNING m.id AS meal_uuid

在您设置m为别名的选择中,meal但其范围是SELECT查询(因此m未在外部insert语句中定义)。


推荐阅读