оракул вставить 1 строку несколько столбцов в несколько строк один столбец - PullRequest
0 голосов
/ 25 июня 2019

У меня есть таблица 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

Я уже сделал то, что мне нужно, используя LOOP и курсоры, но мне нужно сделать это с одной вставкой для повышения производительности.

есть идеи?

EDIT:

Благодаря ответам я достиг того, что мне нужно, с помощью 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

Ответы [ 3 ]

1 голос
/ 25 июня 2019

Использование 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 | 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 <> скрипка здесь

0 голосов
/ 25 июня 2019

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'));

0 голосов
/ 25 июня 2019

Используя 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
...