Oracle 数据库提供了一个多表插入功能,也就是 INSERT ALL 语句。这个功能可以方便数据仓库中的 ETL 操作,基于不同逻辑将数据插入一个或者多个不同的表中。
PostgreSQL 被称为开源领域的 Oracle,虽然没有提供 INSERT ALL 语句,但是可以通过递归查询(WITH 语句)实现类似的功能。
首先创建一个源数据表和三个目标表:
CREATE TABLE src_table( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(10) NOT NULL);INSERT INTO src_table VALUES (1, '张三');INSERT INTO src_table VALUES (2, '李四');INSERT INTO src_table VALUES (3, '王五');CREATE TABLE tgt_t1 ASSELECT * FROM src_table WHERE FALSE;CREATE TABLE tgt_t2 ASSELECT * FROM src_table WHERE FALSE;CREATE TABLE tgt_t3 ASSELECT * FROM src_table WHERE FALSE;
无条件的多表插入语句
Oracle 中的 INSERT ALL 语句可以将数据输入插入一个或者多个表中,因此也被称为多表插入语句。第一种形式的 INSERT ALL 语句是无条件的插入语句,源数据中的每一行数据都会被插入到每个目标表中。
-- Oracle 语法INSERT ALL INTO tgt_t1(id, name) VALUES(id, name) INTO tgt_t2(id, name) INTO tgt_t3(id, name)SELECT * FROM src_table;
执行以上多表插入语句之后,三个目标表中都生成了 3 条记录。
PostgreSQL 可以使用以下 WITH 语句实现无条件的多表插入语句:
WITH s AS ( SELECT id, name FROM src_table),t1 AS ( INSERT INTO tgt_t1(id, name) SELECT * FROM s),t2 AS ( INSERT INTO tgt_t2(id,t3 AS ( INSERT INTO tgt_t3(id, name) SELECT * FROM s)SELECT 1;SELECT * FROM tgt_t1;ID|NAME |--|------| 1|张三 | 2|李四 | 3|王五 |SELECT * FROM tgt_t2;ID|NAME |--|------| 1|张三 | 2|李四 | 3|王五 |SELECT * FROM tgt_t3;ID|NAME |--|------| 1|张三 | 2|李四 | 3|王五 |
其中,s 代表了数据源,t1 实现了 tgt_t1 的数据插入,依此类推。最终通过一个 WITH 语句实现了三个表的插入操作。
原文地址:https://tonydong.blog.csdn.net
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。