[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