SQL - 需要为记录填充序列
SQL - Need to populate sequences for records
我有以下 table (PART_MAP).
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 |
使用 table,我需要像这样在另一个 table (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 shell 脚本在 oracle 上调用 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');
对于 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
语句快得多。
我有以下 table (PART_MAP).
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 |
使用 table,我需要像这样在另一个 table (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 shell 脚本在 oracle 上调用 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');
对于 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
语句快得多。