SQL語句寫法優化﹗怎樣有最好的執行效率?(附表例和源碼)(200分)

  • 主题发起人 主题发起人 lzm
  • 开始时间 开始时间
L

lzm

Unregistered / Unconfirmed
GUEST, unregistred user!
有一表如下
工號 姓名 時間 序號
001 abc 08:00 1
001 abc 12:01 2
001 abc 13:28 3
001 abc 17:40 4
002 def 07:30 1
002 def 22:59 2

記錄人員當天進出的數據。 序號欄需要在SQL存儲過程中產生。這個序號必須存在﹐不要告訴我 前三個字段相加也可識別一條記錄。

在我的本本(P41.8, DDR256,30g 4500 WIN2K SQL2K)用游標產生序號
2萬筆資料約8分鐘﹐ 相同配置台式機約7分鐘(IBM40G 7200).

有哪位高手來挑戰有更高效的SQL寫法?
我寫的游標如下﹕
-----------------------

--ygbh 工號 timea 時間

declare cur_skjl cursor for
select ygbh,timea from skjl order by ygbh,timea
open cur_skjl
fetch next from cur_skjl into @ygbh,@timea

while (@@fetch_status=0)
begin
Update skjl set xh=(select count(*) from kqskjl where ygbh=@ygbh and timea<=@timea)
where ygbh=@ygbh and timea=@timea
fetch next from cur_kqskjl into @ygbh,@timea
end
Close cur_skjl
deallocate cur_skjl
-----------------------------
 
--ygbh 工號 timea 時間
declare @Preygbh int, @i int
set @Preygbh = 0
declare cur_skjl cursor for
select ygbh,timea from skjl order by ygbh,timea
open cur_skjl
fetch next from cur_skjl into @ygbh,@timea

while (@@fetch_status=0)
begin
if @Preygbh =@ygbh
set @i = @i + 1
else
set @i = 1
Update skjl set xh = @i
where ygbh=@ygbh and timea=@timea
set @Preygbh =@ygbh
fetch next from cur_kqskjl into @ygbh,@timea
end
Close cur_skjl
deallocate cur_skjl
-----------------------------

 
看看我这个,一句话搞定。

create table a_test(id varchar(10),sj varchar(20),ord int)

insert into a_test values('001','07',0)
insert into a_test values('001','08',0)
insert into a_test values('001','09',0)

insert into a_test values('002','07',0)
insert into a_test values('002','08',0)
insert into a_test values('002','09',0)

insert into a_test values('003','07',0)
insert into a_test values('003','08',0)
insert into a_test values('003','09',0)

select * from a_test

update a_test set ord=(select count(*)+1 from a_test b where b.sj<a_test.sj and b.id=a_test.id)



 
楼上用变量自累加来生成序号的方法是最快的
 
为什么不用自增字段
或 默认值为getdate() 的 datetime字段
或 时间戳字段
 
非常感謝:xzh2000
一直就在思考應該有類似你的一句話寫法。以前沒搞明白數據表的別名在子查詢時可
直接引用。 再次感謝﹗

Xelloss 的思路和我的一樣﹐效率更差。我以前用的就是變量累加的寫法。
 
“update a_test set ord=(select count(*)+1 from a_test b where b.sj<a_test.sj and b.id=a_test.id)”,值得学习!
 
多人接受答案了。
 
后退
顶部