postgresql 引用未插入RETURNING子句中的列

kokeuurv  于 2023-01-12  发布在  PostgreSQL
关注(0)|答案(1)|浏览(122)

这些是我的数据库中的现有表。Expense和Revenue表中的字段"record_prt_id"是与Record表中的字段"id"相关的外键。

  • -记录
    | 身份证|数量|记录日期|属性标识|
    | - ------|- ------|- ------|- ------|
    | 1个|一百元|2022年10月15日|1个|
    | 第二章|一百五十元|2022年12月22日|1个|
    | 三个|两千元|2022年10月1日|第二章|
    | 四个|一千五百元|2022年11月1日|1个|
  • -费用
    | 记录指针标识|费用_类型|
    | - ------|- ------|
    | 1个|修复|
    | 第二章|水|
  • -收入
    | 记录指针标识|收入类型|
    | - ------|- ------|
    | 三个|租金|
    | 四个|偿还|
    我需要插入这两项新费用:
  • -临时费用
    | 数量|记录日期|费用_类型|属性标识|
    | - ------|- ------|- ------|- ------|
    | 五十元|二○二二年九月十三日|电力|第二章|
    | 一百元|二○二二年八月十五日|垃圾|三个|
    我首先需要将这两项费用插入到记录表中,然后插入到费用表中,最终结果如下所示:
  • -记录
    | 身份证|数量|记录日期|属性标识|
    | - ------|- ------|- ------|- ------|
    | 1个|一百元|2022年10月15日|1个|
    | 第二章|一百五十元|2022年12月22日|1个|
    | 三个|两千元|2022年10月1日|第二章|
    | 四个|一千五百元|2022年11月1日|1个|
    | 五个|五十元|二○二二年九月十三日|第二章|
    | 六个|一百元|二○二二年八月十五日|三个|
  • -费用
    | 记录指针标识|费用_类型|
    | - ------|- ------|
    | 1个|修复|
    | 第二章|水|
    | 五个|电力|
    | 六个|垃圾|
    下面是我的疑问:
WITH inserted_records AS (
INSERT INTO record(amount, record_date, property_id)
SELECT e.amount, e.record_date, e.property_id 
FROM expense_tmp e 
RETURNING id, /* this doesn't work */ e.expense_type
)
INSERT INTO expense(record_prt_id, expense_type) 
SELECT r.id, r.expense_type
FROM inserted_records r;

但是postgres给了我这个错误
错误:表格"e"行5缺少FROM子句条目:退货标识,即费用类型
我需要在第二个INSERT语句的RETURNING子句中获取expense_type列,如何实现这一点?

aelbi1ox

aelbi1ox1#

您可以向事务添加更多CTE语句,并在插入记录之前生成插入ID,以避免一些小问题。

WITH select_query AS (
   SELECT e.amount, e.record_date, e.property_id, e.expense_type , lat.id::bigint+ordinality::bigint AS insertid 
FROM expense_tmp e WITH ORDINALITY , LATERAL (SELECT MAX(id) id FROM record ) AS lat 
),inserted_records AS (
INSERT INTO record(id ,amount, record_date, property_id)
SELECT e.insertid ,e.amount, e.record_date, e.property_id 
FROM select_query e 
RETURNING id, /* this doesn't work */ e.expense_type
)
INSERT INTO expense(record_prt_id, expense_type) 
SELECT r.id, a.expense_type
FROM inserted_records r 
JOIN select_query a ON a.insertid = r.id ;

横向和顺序性也可通过以下方式交换:

nextval('record_seq'::regclass) AS insertid

相关问题