2015-03-08 2 views
0

У меня есть таблица (PART_MAP).SQL - необходимо заполнить последовательности записей

PART | OFFER  | 
--------+------------ 
part1 | offer01 | 
part1 | offer02 | 
part1 | offer03 | 
part1 | offer04 | 
part1 | offer05 | 
part2 | offer06 | 
part2 | offer07 | 
part2 | offer08 | 
part2 | offer09 | 
part2 | offer10 | 
part3 | offer11 | 
part3 | offer12 | 
part3 | offer13 | 
part3 | offer14 | 
part3 | offer15 | 
part3 | offer16 | 
... 
part100 | offer1007 | 
part100 | offer1008 | 
part100 | offer1009 | 
part100 | offer1110 | 

Использование Thie таблицы, мне нужно создать вставки в другую таблицу (PART_MAP_SET) как этот

SERIALNUM | GRP   | PART | OFFER  | 
------------------------------------------------ 
0   | part1_grp | part1 | offer01 | 
1   | part1_grp | part1 | offer02 | 
2   | part1_grp | part1 | offer03 | 
3   | part1_grp | part1 | offer04 | 
4   | part1_grp | part1 | offer05 | 
0   | part2_grp | part2 | offer06 | 
1   | part2_grp | part2 | offer07 | 
2   | part2_grp | part2 | offer08 | 
3   | part2_grp | part2 | offer09 | 
4   | part2_grp | part2 | offer10 | 
0   | part3_grp | part3 | offer11 | 
1   | part3_grp | part3 | offer12 | 
2   | part3_grp | part3 | offer13 | 
3   | part3_grp | part3 | offer14 | 
4   | part3_grp | part3 | offer15 | 
5   | part3_grp | part3 | offer16 | 
... 
0   | part100_grp | part100 | offer1007 | 
1   | part100_grp | part100 | offer1008 | 
2   | part100_grp | part100 | offer1009 | 
3   | part100_grp | part100 | offer1110 | 

Я использую скрипт оболочки Unix для вызова SQLPlus на оракула. Чтобы свести к минимуму количество раз, когда мне нужно подключиться к БД, я пытаюсь создать инструкции вставки как буферизованный вывод из одного запроса, а затем запускаю этот буферный вывод как скрипт.

Я подкачка выхода ниже запроса

select 'insert into part_map_set 
(serialnum, grp, part, offer) 
values 
(' || XXXX 
    ||', ''' 
    || part ||'_grp'', ''' 
    || part 
    || ''', ''' 
    || offer 
    || ''');' 
from (part_map); 

У меня возникают проблемы с XXXX частью. Если я могу заполнить его, мой наматывается выход будет

insert into part_map_set (serialnum, grp, part, offer) values (0, 'part1_grp', 'part1', 'offer01'); 
insert into part_map_set (serialnum, grp, part, offer) values (1, 'part1_grp', 'part1', 'offer02'); 
... 
insert into part_map_set (serialnum, grp, part, offer) values (0, 'part2_grp', 'part2', 'offer06'); 
... 

Любые предложения, как я могу генерировать эту последовательность каждого партнера от 0 до N.

Мой последний курорт будет создать 100 временных последовательностей (1 на одного партнера), а затем выберите последовательности. Но я не буду там еще :)

Ниже поможет вам настроить:

Create table part_map (part varchar2(20), offer varchar2(20)); 
Create table part_map_set (serialnum number(4), grp varchar2(20), part varchar2(20), offer varchar2(20)); 
insert into part_map (part, offer) values ('part1', 'offer01'); 
insert into part_map (part, offer) values ('part1', 'offer02'); 
insert into part_map (part, offer) values ('part1', 'offer03'); 
insert into part_map (part, offer) values ('part1', 'offer04'); 
insert into part_map (part, offer) values ('part1', 'offer05'); 
insert into part_map (part, offer) values ('part2', 'offer06'); 
insert into part_map (part, offer) values ('part2', 'offer07'); 
insert into part_map (part, offer) values ('part2', 'offer08'); 
insert into part_map (part, offer) values ('part2', 'offer09'); 
insert into part_map (part, offer) values ('part2', 'offer10'); 
insert into part_map (part, offer) values ('part3', 'offer11'); 
insert into part_map (part, offer) values ('part3', 'offer12'); 
insert into part_map (part, offer) values ('part3', 'offer13'); 
insert into part_map (part, offer) values ('part3', 'offer14'); 
insert into part_map (part, offer) values ('part3', 'offer15'); 
insert into part_map (part, offer) values ('part3', 'offer16'); 
insert into part_map (part, offer) values ('part100', 'offer1007'); 
insert into part_map (part, offer) values ('part100', 'offer1008'); 
insert into part_map (part, offer) values ('part100', 'offer1009'); 
insert into part_map (part, offer) values ('part100', 'offer1110'); 
+0

Как у GRP есть отображение 1: 1 для ЧАСТИ, в чем его суть? – APC

+0

Sharp глаз APC. Ты прав. Я сделал ошибку. I infact попытался упростить мою фактическую постановку задачи в приведенном выше вопросе, основываясь на простом примере. Теперь я понимаю, что если я сопоставляю свою фактическую проблему с этим примером, PART_MAP_SET не имеет столбца PART. – pradipti

ответ

2

Для XXXX, то я думаю, что вы хотите row_number():

select 'insert into part_map_set 
(serialnum, grp, part, offer) 
values 
(' || row_number() over (partition by part order by part) 
    ||', ''' 
    || part ||'_grp'', ''' 
    || part 
    || ''', ''' 
    || offer 
    || ''');' 
from part_map; 

Там могут быть и другие причины, почему вы генерируете код таким образом, но вы можете использовать весь оператор как один insert:

insert into part_map_set (serialnum, grp, part, offer) 
    select row_number() over (partition by part order by part), 
      part ||'_grp', part, offer 
    from part_map; 

Это должно быть намного быстрее, чем два независимых оператора insert.

+0

row_number() - это то, что я искал. Спасибо, Гордон. Поскольку мне нужно было начинать мои последовательности с 0, я добавляю «-1» перед следующей запятой. Еще раз спасибо. И да, я натолкнулся на упрощенную мою фактическую постановку задачи в указанном выше вопросе, ограничив ее только поиском части XXXX. Мне нужно создать инструкции вставки из-за некоторых мелких причин. Спасибо за предложение альтернативного решения. – pradipti

Смежные вопросы