Re: [SQL ] 不知道該用什麼語法才能解決

看板Database作者 (TeemingVoid)時間13年前 (2012/08/28 20:38), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《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
文章代碼(AID): #1GFBkeO6 (Database)
文章代碼(AID): #1GFBkeO6 (Database)