Oracle 數據倉庫ETL技術之多表插入語句的示例詳解
大家好!我是只談技術不剪發(fā)的 Tony 老師。
ETL(提取、轉換、加載)是指從源系統(tǒng)中提取數據并將其放入數據倉庫的過程。Oracle 數據庫為 ETL 流程提供了豐富的功能,今天我們就給大家介紹一下 Oracle 多表插入語句,也就是INSERT ALL 語句。
創(chuàng)建示例表
我們首先創(chuàng)建一個源數據表和三個目標表:
CREATE TABLE src_table( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR2(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 AS SELECT * FROM src_table WHERE 1=0; CREATE TABLE tgt_t2 AS SELECT * FROM src_table WHERE 1=0; CREATE TABLE tgt_t3 AS SELECT * FROM src_table WHERE 1=0;
無條件的 INSERT ALL 語句
INSERT ALL 語句可以用于將多行輸入插入一個或者多個表中,因此也被稱為多表插入語句。第一種形式的 INSERT ALL
語句是無條件的插入語句,源數據中的每一行數據都會被插入到每個目標表中。例如:
INSERT ALL INTO tgt_t1(id, name) VALUES(id, name) INTO tgt_t2(id, name) VALUES(id, name) INTO tgt_t3(id, name) VALUES(id, name) SELECT * FROM src_table; 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|王五 |
執(zhí)行以上多表插入語句之后,三個目標表中都生成了 3 條記錄。
我們也可以多次插入相同的表,實現一個插入語句插入多行數據的效果。例如:
TRUNCATE TABLE tgt_t1; INSERT ALL INTO tgt_t1(id, name) VALUES(4, '趙六') INTO tgt_t1(id, name) VALUES(5, '孫七') INTO tgt_t1(id, name) VALUES(6, '周八') SELECT 1 FROM dual; SELECT * FROM tgt_t1; ID|NAME | --|------| 4|趙六 | 5|孫七 | 6|周八 |
在以上插入語句中,tgt_t1 出現了三次,最終在該表中插入了 3 條記錄。這種語法和其他數據庫中的以下多行插入語句效果相同:
-- MySQL、SQL Server、PostgreSQL以及SQLite INSERT INTO tgt_t1(id, name) VALUES(4, '趙六'), (5, '孫七'), (6, '周八');
另外,這種無條件的 INSERT ALL 語句還可以實現列轉行(PIVOT)的功能。例如:
CREATE TABLE src_pivot( id INTEGER NOT NULL PRIMARY KEY, name1 VARCHAR2(10) NOT NULL, name2 VARCHAR2(10) NOT NULL, name3 VARCHAR2(10) NOT NULL ); INSERT INTO src_pivot VALUES (1, '張三', '李四', '王五'); TRUNCATE TABLE tgt_t1; INSERT ALL INTO tgt_t1(id, name) VALUES(id, name1) INTO tgt_t1(id, name) VALUES(id, name2) INTO tgt_t1(id, name) VALUES(id, name3) SELECT * FROM src_pivot; SELECT * FROM tgt_t1; ID|NAME | --|------| 1|張三 | 1|李四 | 1|王五 |
src_pivot 表中包含了 3 個名字字段,我們通過 INSERT ALL
語句將其轉換 3 行記錄。
有條件的 INSERT ALL 語句
第一種形式的 INSERT ALL 語句是有條件的插入語句,可以將滿足不同條件的數據插入不同的表中。例如:
TRUNCATE TABLE tgt_t1; TRUNCATE TABLE tgt_t2; TRUNCATE TABLE tgt_t3; INSERT ALL WHEN id <= 1 THEN INTO tgt_t1(id, name) VALUES(id, name) WHEN id BETWEEN 1 AND 2 THEN INTO tgt_t2(id, name) VALUES(id, name) ELSE INTO tgt_t3(id, name) VALUES(id, name) SELECT * FROM src_table; SELECT * FROM tgt_t1; ID|NAME | --|------| 1|張三 | SELECT * FROM tgt_t2; ID|NAME | --|------| 1|張三 | 2|李四 | SELECT * FROM tgt_t3; ID|NAME | --|------| 3|王五 |
tgt_t1 中插入了 1 條數據,因為 id 小于等于 1 的記錄只有 1 個。tgt_t2 中插入了 2 條數據,包括 id 等于 1 的記錄。也就是說,前面的 WHEN 子句不會影響后續(xù)的條件判斷,每個條件都會單獨進行判斷。tgt_t3 中插入了 1 條數據,ELSE 分支只會插入不滿足前面所有條件的數據。
📝有條件的多表插入語句最多支持 127 個 WHEN 子句。
有條件的 INSERT FIRST 語句
有條件的 INSERT FIRST 的原理和 CASE 表達式類似,只會執(zhí)行第一個滿足條件的插入語句,然后繼續(xù)處理源數據中的其他記錄。例如:
TRUNCATE TABLE tgt_t1; TRUNCATE TABLE tgt_t2; TRUNCATE TABLE tgt_t3; INSERT FIRST WHEN id <= 1 THEN INTO tgt_t1(id, name) VALUES(id, name) WHEN id BETWEEN 1 AND 2 THEN INTO tgt_t2(id, name) VALUES(id, name) ELSE INTO tgt_t3(id, name) VALUES(id, name) SELECT * FROM src_table; SELECT * FROM tgt_t1; ID|NAME | --|------| 1|張三 | SELECT * FROM tgt_t2; ID|NAME | --|------| 2|李四 | SELECT * FROM tgt_t3; ID|NAME | --|------| 3|王五 |
以上語句和上一個示例的差別在于源數據中的每個記錄只會插入一次,tgt_t2 中不會插入 id 等于 1 的數據。
多表插入語句的限制
Oracle 多表插入語句存在以下限制:
- 多表插入只能針對表執(zhí)行插入操作,不支持視圖或者物化視圖。
- 多表插入語句不能通過 DB Link 針對遠程表執(zhí)行插入操作。
- 多表插入語句不能通針對嵌套表執(zhí)行插入操作。
- 所有 INSERT INTO 子句中的字段總數量不能超過 999 個。
- 多表插入語句中不能使用序列。多表插入語句被看作是單個語句,因此只會產生一個序列值并且用于所有的數據行,這樣會導致數據問題。
- 多表插入語句不能和執(zhí)行計劃穩(wěn)定性功能一起使用。
- 如果任何目標并使用了 PARALLEL 提示,整個語句都會被并行化處理。如果沒有目標表使用 PARALLEL 提示,只有定義了 PARALLEL 屬性的目標表才會被并行化處理。
- 如果多表插入語句中的任何表是索引組織表,或者定義了位圖索引,都不會進行并行化處理。
到此這篇關于Oracle 數據倉庫 ETL 技術之多表插入語句的示例詳解的文章就介紹到這了,更多相關Oracle 多表插入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
oracle導出sql語句的結果集和保存執(zhí)行的sql語句(深入分析)
本篇文章是對oracle導出sql語句的結果集與保存執(zhí)行的sql語句進行了詳細的分析介紹,需要的朋友參考下2013-05-05Oracle數據庫如何將DATE類型字段格式轉換為YYYY/MM/DD
在Oracle數據庫中,盡管DATE類型本身并不攜帶任何特定的格式信息,但通過TO_CHAR函數我們可以方便地將DATE類型的數據轉換為我們所需要的格式,下面給大家介紹Oracle數據庫如何將DATE類型字段格式轉換為YYYY/MM/DD樣式,感興趣的朋友跟隨小編一起看看吧2024-04-04oracle正則表達式多項匹配時相似項有優(yōu)先級詳解
這篇文章主要給大家介紹了關于oracle正則表達式多項匹配時相似項有優(yōu)先級的相關資料,Oracle中使用正則表達式需先使用REGEXP_LIKE函數來匹配字符串,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-06-06centos 6.5下安裝oracle 11gR2與Oracle自動啟動的配置
CentOS 下安裝 Oracle 是一件比較麻煩的事情,下面這篇文章主要介紹了在 centos 6.5下安裝oracle 11gR2的前的配置步驟,以及安裝完成后,如何設置為隨系統(tǒng)自動啟動。配置完成后,啟動圖形化安裝,沒有什么可說的,本文就沒有一一截圖。需要的朋友可以參考借鑒。2017-01-01