【问题标题】:SQL - Need to populate sequences for recordsSQL - 需要为记录填充序列
【发布时间】:2015-03-08 21:09:31
【问题描述】:

我有下表 (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 |

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

【问题讨论】:

  • 由于 GRP 与 PART 有 1:1 的映射关系,这有什么意义?
  • 锐眼APC。你是对的。我在那里犯了一个错误。事实上,我试图根据简单的示例简化上述问题中的实际问题陈述。我现在意识到,如果我将我的实际问题映射到这个例子,PART_MAP_SET 没有 PART 列。

标签: sql oracle sequence records


【解决方案1】:

对于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 语句快得多。

【讨论】:

  • row_number() 是我想要的。谢谢戈登。因为我需要从 0 开始我的序列,所以我在后面的逗号之前放了一个“-1”。再次感谢你。是的,我实际上简化了上述问题中的实际问题陈述,将其限制为仅查找 XXXX 部分。由于一些琐碎的原因,我必须创建插入语句。不过也感谢您提出替代解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 2016-07-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
相关资源
最近更新 更多