如何在Oracle中使用UNION ALL和INSERT ALL生成資料?
問題
您想了解UNION ALL和INSERT ALL在生成少量資料方面的區別。
解決方案
我最近一直在生成少量資料來測試一些功能,並發現了Oracle中的幾個選項。UNION ALL和INSERT ALL是Oracle中常用用於生成少量資料的兩個選項。
Oracle中最常見的集合運算子是UNION和UNION ALL。即使這些集合之間沒有關係,這些運算子也用於組合資料集。
UNION 建立一個不同的集合,而UNION ALL允許重複。刪除重複項可能會對效能產生巨大影響,因此理想情況下,預設使用UNION ALL,稍後再處理重複項。
UNION ALL最常見的用途是生成資料。在Oracle中,我們必須始終從某些內容中進行選擇,因此有一個名為DUAL的特殊偽表。
DUAL表只有一行,因此如果我們想建立多行,我們必須使用UNION ALL組合語句,如下所示
示例
SELECT 'something' FROM DUAL UNION ALL SELECT 'something_else' FROM DUAL UNION ALL SELECT 'something_more' FROM DUAL UNION ALL
我已經使用如下所示的UNION ALL生成資料並將其插入到我的目標表中
示例
-- CREATE a table CREATE TABLE tennis_stats ( tennis_player VARCHAR2(100), grandslam_titles NUMBER(2) ); COMMIT;
示例
-- Generating data using Union All INSERT INTO tennis_stats SELECT REGEXP_SUBSTR(t.tennis_stats, '[^,]+', 1, 1) tennis_player, REGEXP_SUBSTR(t.tennis_stats, '[^,]+', 1, 2) grandslam_titles FROM ( SELECT 'ROGER FEDERER' || ',' || 20 AS tennis_stats FROM DUAL UNION ALL SELECT 'RAFAEL NADAL' || ',' || 19 AS tennis_stats FROM DUAL UNION ALL SELECT 'NOVAK DJOKOVIC' || ',' || 17 AS tennis_stats FROM DUAL ) t ; COMMIT;
INSERT ALL
Oracle SQL 具有多表插入操作,允許我們在單個語句中將資料插入多個表。當我們有一個填充多個目標的源時,多表插入非常有用。
INSERT ALL語法旨在向多個表新增資料,但我通常將其用於生成資料並將多行插入同一表。
例如,假設我們想使用Insert All選項載入上面顯示的相同資料。
示例
-- CREATE a table CREATE TABLE tennis_stats ( tennis_player VARCHAR2(100), grandslam_titles NUMBER(2) ); COMMIT;
示例
-- Generating data using Insert All INSERT ALL INTO tennis_stats VALUES ( 'ROGER FEDERER', 20) INTO tennis_stats VALUES ( 'RAFAEL NADAL', 19) INTO tennis_stats VALUES ( 'NOVAK DJOKOVIC', 17) SELECT * FROM dual; COMMIT;
注意:INSERT ALL不使用序列。INSERT ALL每個語句只遞增一次序列,而不是每個引用遞增一次。
INSERT ALL語句有一個小問題——上面的程式碼沒有列出所有列名。在真實的SQL語句中,我們不想浪費太多空間來重複相同的列列表。此外,排除列名可以使查詢具有前瞻性。
如果table tennis_stats的未來版本添加了一個新列,前面的語句將引發異常,而不是靜默地寫入壞資料。另一方面,列出列名可以確保值位於正確的列中,即使列順序發生更改也是如此。排除列名是一個有爭議的風格選擇。
結論
INSERT ALL 看起來簡潔易用,但總的來說,UNION ALL 更適合生成資料。INSERT ALL語句比UNION ALL解析速度慢,尤其是在具有數百行的較長語句中。
如果我們的應用程式正在生成大量資料,則INSERT ALL比多個INSERT語句更好。
總之,INSERT ALL 看起來簡潔,但實際上並不適合生成大量資料。