sql - oracle将1行多列插入多行一列
问题描述
我有一个表 t1 包含以下内容:(数百万行)
ID ID_1 ID_2 ID_3 ID_4
---------------------------------
1 10 11 12 13
2 14 15 16 17
3 18 19 20 21
我需要将这些数据插入到另一个表 t2 中,如下所示:
ID ID_X
------------
1 10
1 11
1 12
1 13
2 14
2 15
2 16
2 17
3 18
3 19
3 20
3 21
我已经使用 LOOPs 和 cursors 完成了我需要的操作,但是我需要使用单个插入来完成它以获得更好的性能。
有任何想法吗 ?
编辑:
感谢回复,我使用 UNPIVOT 实现了我所需要的。
现在我需要进一步向 t2 表添加一个增量列,如下所示:
ID ID_X ID_Y
----------------------
1 10 0
1 11 200
1 12 400
1 13 600
2 14 0
2 15 200
2 16 400
2 17 600
3 18 0
3 19 200
3 20 400
3 21 600
解决方案
使用UNPIVOT
.
甲骨文设置:
CREATE TABLE t1 ( ID, ID_1, ID_2, ID_3, ID_4 ) AS
SELECT 1, 10, 11, 12, 13 FROM DUAL UNION ALL
SELECT 2, 14, 15, 16, 17 FROM DUAL UNION ALL
SELECT 3, 18, 19, 20, 21 FROM DUAL;
CREATE TABLE t2 ( ID NUMBER, ID_X NUMBER );
插入语句:
INSERT INTO t2 (id, id_x )
SELECT id, value
FROM t1
UNPIVOT ( value FOR name IN ( ID_1, ID_2, ID_3, ID_4 ) );
输出:
SELECT * FROM t2;
身份证 | ID_X -: | ---: 1 | 10 1 | 11 1 | 12 1 | 13 2 | 14 2 | 15 2 | 16 2 | 17 3 | 18 3 | 19 3 | 20 3 | 21
db<>在这里摆弄
推荐阅读
- pandas - 与非 gui 相比,为什么直方图刻度在 gui 中显示不同的答案?
- pug - 嵌套包含在错误位置的 Pug 放置块内容中
- node.js - 使用 bash 刷新 chrome 浏览器窗口
- javascript - 将子项的宽度设置为父项的宽度
- mysql - MySQL、MariaDB:如何创建子父分层递归查询?
- c# - 如何使用 HttpClient 处理数据提供者实例?
- oracle-cloud-infrastructure - Intellij 中 OCI Java SDK 的 Gradle 设置
- networking - 通过子网与另一个接口的子网相同的虚拟接口发送数据包
- html - 如何将子菜单添加到水平 HTML 导航栏
- azure - AzureDevops - get-AzureRMroleassignment - [错误] 类型为“Microsoft.Rest.Azure.CloudException”的异常被抛出