oracle将1行多列插入多行一列

Posted

技术标签:

【中文标题】oracle将1行多列插入多行一列【英文标题】:oracle insert 1 row multiple columns into multiple rows one column 【发布时间】:2019-06-25 11:14:36 【问题描述】:

我有一个表 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

【问题讨论】:

假设您使用的是 11g 或更高版本,您所追求的是 UNPIVOT 一旦问题得到回答,请不要在问题上编辑额外的内容。相反,您应该提出一个新问题来涵盖新问题。 【参考方案1】:

使用UNPIVOT

Oracle 设置

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小提琴here

【讨论】:

谢谢!那正是我所需要的!你能检查我帖子上的编辑吗,因为我需要在我的表中添加新列 @ghostman 200*ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY name ) AS id_y【参考方案2】:

使用UNION 这是可以实现的。以下查询将起作用:

INSERT INTO Newtable (ID, ID_X) 
SELECT ID, ID_X FROM (
    SELECT ID, ID_1 AS ID_X FROM TableName UNION
    SELECT ID, ID_2 AS ID_X FROM TableName UNION
    SELECT ID, ID_3 AS ID_X FROM TableName UNION  
    SELECT ID, ID_4 AS ID_X FROM TableName
) A
ORDER BY ID, ID_X

【讨论】:

因为这篇文章是关于 Oracle 的,但在demo 使用 SQL Server。【参考方案3】:

select ID, ID_X from test unpivot(ID_X for value in (ID_1 as 'A', ID_2 as 'B',ID_3 as 'C',ID_4 as 'D'));

【讨论】:

以上是关于oracle将1行多列插入多行一列的主要内容,如果未能解决你的问题,请参考以下文章

如何在EXCEL表格里面,一次性插入多行(或多列)表格呢?请教?

oracle单行多列,拆分成多行

如何在oracle 11g中使用一个INSERT语句在一列中插入多行[重复]

oracle 中update 多列

在单个事务中插入多行时 Oracle 查询性能下降

使用 PHP 将多行 Oracle 结果集插入 MYSQL