SQL INSERT/SELECT 使用 WITH 子句

SQL INSERT/SELECT using WITH clause

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

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] 错误:table“m”[=26= 缺少 FROM 子句条目]

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

快速回答:将 RETURNING m.id AS meal_uuid 更改为 RETURNING id AS meal_uuid (db 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

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