如何从INSERT .... SELECT .... RETURNING的select查询中返回一列

时间:2018-04-23 07:34:40

标签: postgresql common-table-expression

我有一个stock_details视图:

item INTEGER,
quantity NUMERIC(8,2),
discount NUMERIC(8,2),
taxable NUMERIC(8,2),
tax NUMERIC(8,2),
unique_serial CHARACTER VARYING(50)
.....

我还有两个表:

invoice_item(
    id SERIAL PRIMARY KEY,
    item INTEGER,
    quantity NUMERIC(8,2),
    discount NUMERIC(8,2),
    taxable NUMERIC(8,2),
    tax NUMERIC(8,2),
) 

unique_invoice_item(
    invoice_item INTEGER PRIMARY KEY,
    unique_serial CHARACTER VARYING(50),
    item INTEGER,
    ..............,
    UNIQUE(unique_serial),
    UNIQUE(unique_serial, item),
    FOREIGN KEY (invoice_item) REFERENCES invoice_item(id)
}

我希望将stock_details上的选择查询中的数据插入invoice_itemunique_invoice_item。我尝试使用以下查询执行此操作:

WITH t AS (
    INSERT INTO invoice_item AS ii (item, quantity, discount, taxable, tax) 
    SELECT s.item, s.quantity, s.discount, s.taxable, s.tax
    FROM stock_details AS s WHERE ..........
    RETURNING ii.id, s.unique_serial
)
INSERT INTO unique_invoice_item 
SELECT t.id, s.unique_serial, ........
FROM t JOIN stock_details AS s ON t.unique_serial = s.unique_serial

但是上面的查询不正确,因为它无法返回CTE中的s.unique_serial。

现在我的问题:

有没有办法可以在CTE中返回s.unique_serial列?

OR

还有其他方法可以实现这一目标吗?

注意除了invoice_item以及idinvoice_itemunique_serial之外,unique_serial, item表格中没有任何唯一内容是unique_invoice_item表中的所有唯一列。 item中的invoice_item列和表item中的列unique_invoice_item都引用了一个共同的外表。

2 个答案:

答案 0 :(得分:0)

我认为,根据我的经验,你无法直接获得s.unique_serial。我建议你采取以下两种方式:

  1. 在表格unique_serial中添加列invoice_item并同时插入其值,您可以在Returning
  2. 获取其值
  3. 编写一个函数,它与查询stock_details中的每条记录进行循环。所以你有你想要的所有数据。
  4. 希望我的回答能帮到你。

答案 1 :(得分:0)

不确定,但是从另一篇文章看,你似乎可以使用这样的东西

WITH x AS (
SELECT s.item, s.quantity, s.discount, s.taxable, s.tax, s.unique_serial
FROM stock_details AS s WHERE ..........),
t AS (
    INSERT INTO invoice_item AS ii (item, quantity, discount, taxable, tax) 
    values(x.item, x.quantity, x.discount, x.taxable, x.tax)
    RETURNING ii.id, s.unique_serial
)
INSERT INTO unique_invoice_item 
SELECT t.id, s.unique_serial, ........
FROM t JOIN stock_details AS s ON x.unique_serial = s.unique_serial

参考 - https://dba.stackexchange.com/questions/50693/can-the-returning-clause-return-source-columns-that-are-not-inserted