如何使用Union ALL生成数据并在Oracle中插入ALL?
问题:
您想知道UnionALL和InsertALL之间的区别,以生成少量数据。
解:
最近,我一直在生成少量数据以测试某些功能,并且遇到了Oracle中的两个选项。全部合并和全部插入是Oracle中通常用于生成少量数据的两个选项。
Oracle中最常见的集合运算符是UNION和UNIONALL。这些运算符用于合并数据集,即使这些数据集之间没有关系。
UNION创建一个不同的集合,而UNIONALL允许重复。删除重复项可能会对性能产生巨大影响,因此,理想情况下,默认情况下使用UNIONALL,稍后再处理重复项是理想的选择。
UNIONALL的最常见用法是生成数据。在Oracle中,我们必须始终从某些内容中进行选择,因此有一个名为DUAL的特殊伪表。
DUAL表只有一行,因此,如果要创建多行,则必须将语句与UNIONALL合并,如下所示
示例
SELECT 'something' FROM DUAL UNION ALL SELECT 'something_else' FROM DUAL UNION ALL SELECT 'something_more' FROM DUAL UNION ALL
我已使用UNIONALL如下所示生成数据并将其插入到我的目标表中
示例
-- 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;
全部插入
OracleSQL具有多表插入操作,使我们可以在一条语句中将数据插入到多个表中。当我们有一个填充多个目标的源时,多表插入很有用。
INSERTALL语法旨在将数据添加到多个表中,但是我通常用于生成数据并将多个行插入到同一表中。
例如,假设我们要使用InsertAllOption加载上面显示的相同数据。
示例
-- 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;
注意INSERTALL不使用序列。INSERTALL仅对每个语句增加一次序列,而不对每个引用增加一次。
INSERTALL语句有一个小问题–上面的代码未列出所有列名。在现实世界中的SQL语句中,我们不想浪费太多空间来重复相同的列列表。另外,排除列名将使查询更可靠。
如果将来的表格Tennis_stats版本添加了新列,则前面的语句将引发异常,而不是静默地写入错误数据。另一方面,列出列名称可确保值在正确的列中使用,即使列顺序发生变化也是如此。排除列名是值得商bat的样式选择。
结论
INSERTALL看起来很整洁和容易,但是UNIONALL总体上对于生成数据更好。INSERTALL语句比UNIONALL解析慢,尤其是对于具有数百行的大型语句。
如果我们的应用程序正在生成大量数据,则INSERTALL优于多个INSERT语句。
总之,InsertALL看起来很整洁,但实际上并不意味着要生成大量数据。