可写的公共表达式和多个插入语句[英] writeable common table expression and multiple insert statements

本文是小编为大家收集整理的关于可写的公共表达式和多个插入语句的处理方法,想解了可写的公共表达式和多个插入语句的问题怎么解决?可写的公共表达式和多个插入语句问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

如何在有效的Postgres SQL查询中编写以下内容:

with foo as (select * from ...)
insert into bar select * from foo
insert into baz select * from foo

推荐答案

您可以使用CTE,如果您需要所有这些语句中的所有内容:

with foo as (
      select * from ...
     ),
     b as (
      insert into bar
          select * from foo
          returning *
     )
insert into baz
    select * from foo;

注意:

  • 您应该在insert中包括列列表.
  • 您应该为select *指定列名 .这很重要,因为这些列可能在两个表中不匹配.
  • 我始终将returning与update/insert/delete一起使用.这是普通用例 - 例如,您可以从插入物中获得串行ID.

其他推荐答案

a with子句的范围只是一个查询.我能想到的唯一解决方案是在完成插入后创建视图并删除它.它不会像CTE那样完全是短暂的,但是这里没有数据重复 - 只是(相对)便宜的DDL操作:

-- Create the view
CREATE VIEW foo AS SELECT * FROM ...;

-- Perform the inserts
INSERT INTO bar SELECT * FROM foo;
INSERT INTO baz SELECT * FROM foo;

-- Drop the view when you're done
DROP VIEW foo;

本文地址:https://www.itbaoku.cn/post/1763815.html