[SQL ] 以亂數排序的一種方式

作者: Peruheru (還在想)   2016-04-01 16:56:13
資料庫名稱:MS SQL Server
資料庫版本:2008 R2
內容/問題描述:
純粹分享
假設A表是商品資料,B表是訂單,然後要Join後,亂數排序。並且排序依據是A表商品資料
取亂數順序,再用B表訂單資料取亂數順序,兩個亂數不互相影響,呈現的結果舉例如下:
商品C 訂單3
商品C 訂單1
商品C 訂單2
商品A 訂單2
商品A 訂單1
商品B 訂單2
....
商品雖然亂數排列,但是所有同樣的商品都要排在一起,然後才排訂單
綜合查詢Google後,這是我的寫法
Select * From
(
Select
商品編號, 品名
, Rank() Over (Order By Abs(CheckSum(NewId())) % 10000) As RndA From A
) VA
Inner Join
(
Select
訂單編號, 商品編號, 訂單
, Rank() Over (Order By Abs(CheckSum(NewId())) % 10000) As RndB From B
) VB On VB.商品編號 = VA.商品編號
Order By RndA, RndB
其實原本只想寫到Abs以及它包住的部分就好,但NewId函數似乎會延後到子查詢完成之後
才繼續執行,導致明明是同樣的商品,RndA的數字卻不一樣結果商品沒辦法排在一起。
突發奇想用Rank函數產生的結果是不是就不會受影響了,還好結果證實是可以的,Rand()
或NewId()和我想像的動作不同真是繞了好大圈,為什麼要弄Rand()這種假亂數呢...
或許有更好的寫法?
作者: YaMeiLo (亞妹露~!!)   2016-04-05 21:00:00
我都偷懶直接order by newid()
作者: Peruheru (還在想)   2016-04-20 17:28:00
如果不是因為發現NewId()結果不如預期我也不想XD

Links booklink

Contact Us: admin [ a t ] ucptt.com