0

我想在列(类型)中查找具有特定值(S)的行(记录),并根据同一表中的该行插入多行(例如 2)。

例如,在下面的表 t1 中,我希望为类型为“S”的每一行插入 2 行,其 ID 和价格相同,新的计数器值(对此字段没有具体要求,但是具有相同 ID 的记录的计数器必须是不同),类型将为“B”。

这意味着当根据下表中的第一条记录(1,1200,S,200)插入2行时,新记录的Counter值必须与表中ID=1的记录的Counter值不同(1200和 1201)。因此,在初始表中有三个类型为“S”的记录,然后在最终表中,对于这些记录中的每一个,都插入了两个类型为“B”的新记录和一个新的计数器值:

ID 计数器类型 价格
----------------------
1 1200 小号 200
1 1201 T 400
2 1200 吨 500
3 1546 小号 100 
3 1547 小号 70
4 2607 男 250

输出表 t1 将是:

ID 计数器类型 价格
----------------------
1 1200 小号 200
1 1202 B 200 
1 1203 B 200
1 1201 T 400
2 1200 吨 500
3 1546 小号 100
3 1548 乙 100 
3 1549 乙 100
3 1547 小号 700
3 1550 B 700 
3 1552 B 700
4 2607 男 250
4

3 回答 3

1

你只需要玩两次这个命令:

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
于 2013-10-25T10:51:53.890 回答
1

您需要一个插入选择语句:

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;
于 2013-10-25T10:55:53.987 回答
0

创建序列 my_SEQ

增加 1

从 1 开始

最小值 1

最大值 999999999

不循环

诺卡奇

诺德;

创建表 MY_TABLE1(ID NUMBER,计数器编号(20),类型 varchar2(30),价格编号)

插入 my_table1 (id,counter,type,price) 值 (my_SEQ.nextval,1200,'S',200);

插入 my_table1 (id,counter,type,price) 值 (my_SEQ.nextval,1300,'B',311);

插入 my_table1 (id,counter,type,price) 值 (my_SEQ.nextval,200,'S',110);

插入 my_table1 (id,counter,type,price) 值 (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 是 select * from My_table1 where type='B';

开始

用于REC IN c1

环形

插入 my_table1 (id,counter,type,price)

值(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

于 2013-10-25T11:14:00.457 回答