如何根据表中已有的记录插入多个新记录(在 Oracle 中)



我想在一列(类型)中查找具有特定 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

相关内容

  • 没有找到相关文章

最新更新