如何在INSERT...SELECT...RETURNING中返回列?附视图与表结构
在INSERT...SELECT...RETURNING中返回指定列的实现方案
根据你的视图stock_details以及两张关联表invoice_item、unique_invoice_item的结构,我会分两种场景给你具体的实现方法:
场景1:仅向单张表插入数据并返回指定列
如果你只需要向invoice_item表插入数据(从stock_details视图获取源数据),直接在RETURNING子句后列出你需要返回的列名即可:
INSERT INTO invoice_item (item, quantity, discount, taxable, tax) SELECT item, quantity, discount, taxable, tax FROM stock_details -- 可根据需求添加过滤条件,比如 WHERE unique_serial IS NOT NULL RETURNING item, quantity, discount, taxable, tax; -- 这里指定你要返回的列
这段代码会把stock_details中符合条件的数据插入invoice_item,同时返回你指定的item、quantity等列的内容。
场景2:向两张关联表插入数据并返回指定列
由于unique_invoice_item的主键是invoice_item(关联invoice_item的id),你需要用**WITH子句(CTE)**分两步插入,再关联返回结果:
WITH inserted_invoice AS ( -- 第一步:插入invoice_item并返回需要的字段(包括自动生成的id) INSERT INTO invoice_item (item, quantity, discount, taxable, tax) SELECT item, quantity, discount, taxable, tax FROM stock_details -- 按需添加过滤条件 RETURNING id, item, quantity, discount, taxable, tax ), inserted_unique AS ( -- 第二步:用第一步返回的id插入unique_invoice_item INSERT INTO unique_invoice_item (invoice_item, unique_serial, item) SELECT ii.id, sd.unique_serial, sd.item FROM inserted_invoice ii -- 这里的关联条件要确保数据匹配,建议用唯一键(比如unique_serial)关联,避免item重复导致错误 JOIN stock_details sd ON ii.item = sd.item AND ii.quantity = sd.quantity RETURNING invoice_item, unique_serial ) -- 最后关联两个插入结果,返回你需要的所有指定列 SELECT ii.item, ii.quantity, ii.discount, ii.taxable, ii.tax, iu.unique_serial FROM inserted_invoice ii JOIN inserted_unique iu ON ii.id = iu.invoice_item;
关键注意点
RETURNING子句支持直接指定任意插入后存在的列,包括表的主键(比如invoice_item.id)、你插入的业务字段,甚至可以用表达式生成新值。- 在多表插入场景中,CTE是核心:它能捕获每一步插入的返回结果,让你后续可以关联这些结果来返回完整的目标列。
- 关联
inserted_invoice和stock_details时,尽量用唯一标识(比如unique_serial)来匹配,避免因item重复导致数据错误。
内容的提问来源于stack exchange,提问作者Blip
相关产品推荐
相关产品推荐

