2013-09-19 5 views
2

У меня есть таблицы t1:Множественная вставка, основанная на значении поля?

ID Period 
--- -------- 
1  5 
2  3 
3  2 

(таблица на самом деле имеет 366 различных идентификаторов и их период может быть 23, 24 или 25.)

Я хочу вставить несколько строк в таблице t2 с полями ID и час, где час (ID) в 1 ..Period (ID):

ID Hour 
--- ----- 
1  1 
1  2 
1  3 
1  4 
1  5 
2  1 
2  2 
2  3 
3  1 
3  2 

Как я могу это сделать?

ответ

4

Вы можете достичь этого, используя model пункт, например:

with t1(ID, Period) as(
    select 1, 5 from dual union all 
    select 2, 3 from dual union all 
    select 3, 2 from dual 
) 
select ID 
    , period as hour 
    from t1 
    model 
    partition by (ID) 
    dimension by (1 as indx) 
    measures(period) 
    rules(
    period[for indx from 1 to period[1] increment 1] = cv(indx) 
) 

SQLFiddle Demo

Результат:

 ID  HOUR 
---------- ---------- 
     1   1 
     1   2 
     1   3 
     1   4 
     1   5 
     2   1 
     2   2 
     2   3 
     3   1 
     3   2 

10 rows selected 

И ваше insert заявление может выглядеть следующим образом:

insert into t2(id, hour) 
    select ID 
     , period 
    from t1 
    model 
    partition by (ID) 
    dimension by (1 as indx) 
    measures(period) 
    rules(
     period[for indx from 1 to period[1] increment 1] = cv(indx) 
    ) 
+0

Дело в том, что пример здесь меньше реальной таблицы, в которой у меня есть 366 идентификаторов. Надеюсь, существует способ, который не требует «выбора» для каждого идентификатора. – Matin

+0

@ user1777530 'существует способ, который не требует« выбора »для каждого идентификатора. Я не уверен, что буду следовать. Не могли бы вы рассказать об этом? Неважно, насколько велика ваша таблица. Может быть, это предложение 'with', которое вас смущает. Это просто ради демонстрации. Тебе это не нужно. –

+0

Хорошо. Я почти ничего не знаю о SQL. Таким образом, предложение «с» не требуется. Тогда, я думаю, это отлично работает для меня. Благодарю. – Matin

0

Испытание установки:

CREATE TABLE t1 (
    ID INT PRIMARY KEY, 
    Period INT NOT NULL 
); 

CREATE TABLE t2 (
    ID INT NOT NULL, 
    Hour INT NOT NULL 
    -- There would also be a PK here in real life. 
); 

INSERT INTO t1 VALUES (1, 5); 
INSERT INTO t1 VALUES (2, 3); 
INSERT INTO t1 VALUES (3, 2); 

Фактическая вставка:

INSERT INTO t2 
WITH CTE (ID, Hour) AS (
    SELECT ID, Period FROM t1 
    UNION ALL 
    SELECT ID, Hour - 1 FROM CTE WHERE Hour > 1 
) 
SELECT * FROM CTE; 
Смежные вопросы