作者TeemingVoid (TeemingVoid)
看板Database
标题Re: [SQL ] 不知道该用什麽语法才能解决
时间Tue Aug 28 20:37:57 2012
※ 引述《jim61103 (丁丁)》之铭言:
: 小弟目前在烦恼一个问题
: 我的资料会一直进资料库,但是我想要让我的资料由小排到大,然後在旁边那一栏
: 依照资料的大小给他1 2 3 4的顺序(最小的第一),
: 资料排序必须是由sql帮我排顺序+数字,
: 所以只要一有资料进去,就必须要给他顺序(也就是资料由小倒大的排名)
: 例如 ...
推 TeemingVoid:建议在查询时,才赋予名次资料,不然,每次新增/修改 08/28 15:29
→ TeemingVoid:资料都要更新名次,效能不好。排名次可用 rank() 系列 08/28 15:31
→ TeemingVoid:函数,详情请 Google 或参考 5092 那篇。 08/28 15:31
→ jim61103:请问我的资料是一直进来的 可是要对目前的资料做排名 08/28 18:21
→ jim61103:这样我该怎麽做? 08/28 18:21
推 greetmuta:在trigger里 after inserted 中做 rank的update 呢? 08/28 18:34
楼上的方法当然是可以的,不过(以下的内容并非针对 greetmuta 大),每一笔的
新增、修改、删除都要将所有相关的资料的排序立即改一遍,真的很耽心效率的
问题。
所以,原PO要想一下,如果资料查询的次数比资料异动的次数多很多,或者,资料
查询才是重点(例如效率),这麽做才比较值得。
以下有一段写法,请参考看看....
(最近我一定是太闲了! ^o^)
create database test
go
use test
go
create table lab
(
id int primary key,
data int,
rankNo int
)
go
create trigger UpdateRankingOnLabChanged on lab
for insert, update, delete as
if (select count(*) from inserted) > 0
and (select count(*) from deleted) > 0
and update(rankNo)
return
merge lab as dest
using
(select id, data, RANK() over (order by data) as rankNo from lab)
as source
on (dest.id = source.id)
when matched then
update set dest.rankNo = source.rankNo;
go
-- truncate table lab
-- go
declare @iRow int = 1
declare @iData int
while @iRow <= 10000 -- 要测多少行,请自行决定
begin
set @iData = FLOOR(RAND() * 1000)
if (@iData % 5) = 0
update lab set data = data + 1 where data = @iData
else if (@iData % 4) = 1
delete from lab where data = @iData
else
insert into lab (id, data) values (@iRow, @iData)
set @iRow = @iRow + 1
end
go
select * from lab order by rankNo
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.170.130.34