sql - 使用 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 子句条目
提前感谢您对此的提示,或者如果可能的话,另一种方法。
解决方案
快速回答:更改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
在您设置m
为别名的选择中,meal
但其范围是SELECT
查询(因此m
未在外部insert
语句中定义)。
推荐阅读
- javascript - 扩展运算符不适用于模块功能
- angular - 从数组中删除重复的对象
- javascript - 在 react native 中使用 componentDidMount() 中的间隔
- java - selenium java(chrome驱动程序)中的元素不可点击
- c++ - 在 C++ 中动态创建二维数组时出现问题。这是代码。它不适用于某些特定条件
- android - 在 Flutter App 中,每个屏幕是否应该有不同的广告单元来显示横幅?
- node.js - 如何使用 ExcelJs 将图像插入单元格
- java - 获取 NoSuchMethodError:com.amazonaws.util.StringUtils.trim
- reactjs - REACT 从浏览器签名或登录用户时出现问题,我收到 401(未经授权)
- json - 遍历嵌入在列表中的字典并将键值分配给变量的最佳方法