我想从随机表中获取1000条记录,所以我用:问题使用ROW_NUMBER()来获得随机记录(SQL Server 2005中)
SELECT top 1000
mycol1
, mycol2
, ROW_NUMBER() OVER (ORDER BY NEWID()) rn
FROM mytable
不过,我不希望看到rn
在我的结果集,所以我这样做:
SELECT mycol1
, mycol2
FROM (
SELECT top 1000
mycol1
, mycol2
, ROW_NUMBER() OVER (ORDER BY NEWID()) rn
FROM mytable
) a
当我这样做时,结果不会随机出现。他们来了,就好像我刚才所说的使用row_number()的顶级10000 没有随机化。
当我查询更改为
SELECT mycol1
, mycol2
, rn
FROM (
SELECT top 1000
mycol1
, mycol2
, ROW_NUMBER() OVER (ORDER BY NEWID()) rn
FROM mytable
) a
他们是随机的一次。
我猜sql server做了某种优化,说:“嘿,这家伙不需要列rn
,所以只是忽略它”。但在这种情况下,这会导致意外行为。有什么办法可以避免这种情况? PS:我使用ROW_NUMBER()技巧,因为mytable有10 mio。行和
SELECT top 10000 *
FROM mytable
ORDER BY NEWID()
永远运行,而与ROW_NUMBER()它只需要长达30秒。
喜欢你的“ROW_NUMBER()OVER(ORDER BY NEWID())”。几次使用这个效果很好。 – 2014-11-06 21:24:13