读书人

这个需求用SQL语句能实现吗?该如何解

发布时间: 2012-03-01 10:25:46 作者: rapoo

这个需求用SQL语句能实现吗?
表a如下:


ID 组序 类型
------------------
1 1/3 广告
2 2/3 广告
3 3/3 广告
4 0 节目
5 1/4 广告
6 2/4 广告
7 3/4 广告
8 4/4 广告
9 0 节目


例1:如果删除ID=2的数据时,组序字段要重新计算结果应该如下:

ID 组序 类型
------------------
1 1/2 广告
3 2/2 广告
4 0 节目
5 1/4 广告
6 2/4 广告
7 3/4 广告
8 4/4 广告
9 0 节目

例2:如果删除ID=2和ID=7的数据时,组序字段要重新计算结果应该如下:

ID 组序 类型
------------------
1 1/2 广告
3 2/2 广告
4 0 节目
5 1/3 广告
6 2/3 广告
8 3/3 广告
9 0 节目

[解决办法]
update tt1 set
zx = str((select count(*) from tt1 z
where right(tt1.zx,len(tt1.zx)-charindex( '/ ',tt1.zx))=
right( z.zx,len( z.zx)-charindex( '/ ', z.zx))
and cast(left( z.zx,charindex( '/ ', z.zx)-1) as int) <=
cast(left(tt1.zx,charindex( '/ ',tt1.zx)-1) as int)
))+right(tt1.zx,len(tt1.zx)-charindex( '/ ',tt1.zx))

呵呵,不过我还是建议你把组序和组号分成两个数字字段,免得这么麻烦
如果你实在懒得优化,那就用触发器,效果应该比写SQL语句强
[解决办法]
你要知道即便是 delete ... 2 and 7 and 8.... 他也是一一的所以有下面的
create trigger trg_a on a
for delete
as
begin
select top 1 @id1 = ID from a where 序 = 0 and ID < deleted.ID order by ID desc
select top 1 @id2 = ID from a where 序 = 0 and ID > deleted.ID oder by ID
select @icount count(ID) from a where ID between @id1 and @id2
select @fz = (case ID )
update a set 序 = (case when ID < @deleted.ID then SubString(序,1,2) + @icount
else cast(int,SubString(序,1,1))+ '/ '+@icount ) where ID between @id1 and @id2


drop trg_a
[解决办法]
触发器中有两张逻辑表:
inserted 新增的记录, 或者是更新操作记录被更新后的数据
deleted 删除的记录, 或者是更新操作记录更新前的数据
[解决办法]
--尝试这样修改一下:

create table test(ID int,组序 varchar(4),类型 varchar(8),标识 int)
insert into test values(1, '1/3 ', '广告 ',1)
insert into test values(2, '2/3 ', '广告 ',1)
insert into test values(3, '3/3 ', '广告 ',1)
insert into test values(4, '0 ' , '节目 ',1)
insert into test values(5, '1/4 ', '广告 ',1)
insert into test values(6, '2/4 ', '广告 ',1)
insert into test values(7, '3/4 ', '广告 ',1)
insert into test values(8, '4/4 ', '广告 ',1)
insert into test values(9, '0 ' , '节目 ',1)
insert into test values(1, '1/3 ', '广告 ',2)
insert into test values(2, '2/3 ', '广告 ',2)
insert into test values(3, '3/3 ', '广告 ',2)
insert into test values(4, '0 ' , '节目 ',2)
insert into test values(5, '1/4 ', '广告 ',2)
insert into test values(6, '2/4 ', '广告 ',2)
insert into test values(7, '3/4 ', '广告 ',2)
insert into test values(8, '4/4 ', '广告 ',2)
insert into test values(9, '0 ' , '节目 ',2)
go

create trigger trg_test on test
for delete
as
begin
update a
set
组序=rtrim((select count(*) from test where 标识=a.标识 and ID> b.LID and ID <b.HID and ID <=a.ID))+
'/ '+
rtrim((select count(*) from test where 标识=a.标识 and ID> b.LID and ID <b.HID))
from
test a,
(select
isnull((select max(ID) from test where ID <d.ID and 组序= '0 ' and 标识=d.标识), 0) as LID,
isnull((select min(ID) from test where ID> d.ID and 组序= '0 ' and 标识=d.标识),9999) as HID
from
deleted d) b
where
a.ID> b.LID and a.ID <b.HID
end
go

delete test where ID in(2,6)
go

select * from test
/*
ID 组序 类型 标识
----------- ---- -------- -----------
1 1/2 广告 1
3 2/2 广告 1
4 0 节目 1
5 1/3 广告 1
7 2/3 广告 1
8 3/3 广告 1
9 0 节目 1
1 1/2 广告 2
3 2/2 广告 2
4 0 节目 2
5 1/3 广告 2
7 2/3 广告 2
8 3/3 广告 2
9 0 节目 2
*/
go

drop trigger trg_test
drop table test
go

读书人网 >SQL Server

热点推荐