这是在表中查找随机行的一种可能方法吗?有更好的方法吗?

时间:2013-08-29 00:44:18

标签: sql sql-server

我们有这四个表:

Store (
    row bigint,
    id uniqueidentifier,
    name varchar
)

Products (
    row bigint,
    id uniqueidentifier,
    storeID uniqueidentifier,
    productname varchar
)

Customer (
    row bigint,
    id uniqueidentifier,
    storeID uniqueidentifier,
    fName,
    lName,
    email
)

orders (
    row bigint,
    id uniqueidentifier,
    store_ID uniqueidentifier,
    cust_id uniqueidentifier,
    prod_id uniqueidentifier,
    date datetime
)

我们需要在特定商店的订单表中找到30个随机行。

这是我第一次尝试:

  select TOP 30 * from orders o inner join store s on o.Retailer_ID=s.ID
    where s.Name='XXXX' and  o.Row in (select  ABS(CAST(CAST(NEWID() AS      
               VARBINARY) AS int)) %100000  from orders) and o.Retailer_ID =(select ID 
                  from store s where s.Name= 'XXXX')

但是我对结果并不满意,因为我觉得行的范围永远不会是单个数字而且我做的随机计算在创建从第1行到第1行的真实随机数时似乎不太好行最大数。我不确定订单表中有多少行可能是另一个问题。

有没有更好的方法来查找表中的随机行?

2 个答案:

答案 0 :(得分:4)

事情要简单得多。

   select TOP 30 *
    from orders o 
         join store s on o.Retailer_ID=s.ID
    where s.Name='XXXX'
    order by newid()

答案 1 :(得分:3)

你也可以这样做:

select TOP 30 *
from orders o inner join
     store s
     on o.Retailer_ID = s.ID
where s.Name='XXXX'
order by newid();

这是通过随机排序数据然后选择前30行来返回随机行。在SQL Server中,按newid()排序是一种随机排序数据的方法。