我想在一列(类型)中查找具有特定 vlaue (S) 的行(记录),并根据同一表中的该行插入多行(例如 2)。
例如,在下面的 tabe t1 中,我希望对于类型"S"的每一行,插入 2 行具有相同的 ID 和价格,新的计数器值(对此没有特定要求,但是具有相同 ID 的记录的计数器必须不同),类型将为"B"。
这意味着,当根据下表(1,1200,S,200)中的第一条记录插入2行时,新记录的计数器值必须与表中已有ID=1的记录的计数器值(1200和1201)不同。因此,在初始表中,有三条类型为"S"的记录,然后在最后一个表中,对于其中每条记录,输入了 2 条类型为"B"的新记录和一个新的计数器值:
ID柜台类型价格------------------------1 1200 秒 20011201吨4002 1200 T 5003 1546 S 1003 1547 S 704 2607米 250
输出表 t1 将为:
ID柜台类型价格------------------------1 1200 秒 2001 1202 字节 2001 1203 字节 20011201吨4002 1200 T 5003 1546 S 1003 1548 字节 1003 1549 字节 1003 1547 S 7003 1550 字节 7003 1552 B 7004 2607米 250
你只需要播放两次这个命令:
insert into epn
with w(max) as
(
select max(t.counter) from t -- useful to get max counter value
)
select t.id, w.max + rownum, 'B', t.price -- max + rownum then gives new values
from t, w
where t.type != 'B'; -- Avoid duplicating rows added 1st time
这给出了:
1 1 1200 S 200
2 1 2617 B 200
3 1 2611 B 200
4 1 1201 T 400
5 1 2618 B 400
6 1 2612 B 400
7 2 1200 T 500
8 2 2613 B 500
9 2 2619 B 500
10 3 1547 S 70
11 3 2609 B 70
12 3 2615 B 70
13 3 1546 S 100
14 3 2614 B 100
15 3 2608 B 100
16 4 2607 M 250
17 4 2610 B 250
18 4 2616 B 250
你需要一个插入选择语句:
insert into t1 (ID, Counter, Type, Price)
select ID, Counter+1, 'B', Price from t1 where Type = 'S'
union all
select ID, Counter+2, 'B', Price from t1 where Type = 'S';
编辑:这是一个符合您在下面评论中提到的标准的声明。它获取每个 ID 的最大计数器,并将添加的条目的计数 # 添加到 ID (1、2、3、...)。
insert into t1 (ID, Counter, Type, Price)
select
ID,
(select max(Counter) from t1 where ID = src.ID) + row_number() over (partition by ID order by Price) as new_counter,
'B' as Type,
Price
from
(
select ID, Price
from t1
join (select * from dual union all select * from dual) twice
where t1.Type = 'S'
) src;
创建序列my_SEQ
递增 1
从 1 开始
最小值 1
最大值999999999
无车
无缓存
无序;
创建表MY_TABLE1( 身份证号码,柜台号码(20),瓦尔查尔2型(30),价格编号)
插入my_table1(ID,计数器,类型,价格)值 (my_SEQ.nextval,1200,'S',200);
插入my_table1(ID,计数器,类型,价格)值 (my_SEQ.nextval,1300,'B',311);
插入my_table1(ID,计数器,类型,价格)值 (my_SEQ.nextval,200,'S',110);
插入my_table1(ID,计数器,类型,价格)值 (my_SEQ.nextval,299,'B',329);
从my_table1中选择 *
ID COUNTER TYPE PRICE
62 1200 S 200
63 1300 B 311
64 200 S 110
65 299 B 329
宣
光标 c1 是从 My_table1 中选择 *,其中类型='B';
开始
对于 rec IN C1
圈
插入my_table1(ID,计数器,类型,价格)
值 (my_SEQ.nextval,rec.counter+1,'Z',rec.price);
结束循环;
结束;
从my_table1中选择 *
ID COUNTER TYPE PRICE
63 1300 B 311
65 299 B 329
64 200 S 110
62 1200 S 200
66 1301 Z 311
67 300 Z 329
已选择 6 行。
因此,在光标中选择类型为='B'的所有行,然后将它们插入并稍微更改一下值! 希望这有帮助。 您无法使用序列,但添加 rec.id+1