Re: [SQL ] 不知道該用什麼語法才能解決
※ 引述《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
討論串 (同標題文章)