2012-12-17 144 views
4

可能重复:
Simple update statement so that all rows are assigned a different value选择一个随机值T-SQL

有没有一种方法可以选择从一个子查询的随机值(如颜色)?这里是我试过,但让在每次运行相同的值:

SELECT TOP (100) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ID,--Sequential number from 1 to .. 
       (SELECT TOP 1 color 
        FROM (VALUES (0, 'Red'), 
            (1, 'Green'), 
            (2, 'Yellow')) colors(id, color) 
        ORDER BY NEWID())      AS RandomColor 
FROM sys.all_columns ac1 
     CROSS JOIN sys.all_columns ac2 

但如果我单独运行这一块,我得到不同的颜色:

SELECT TOP 1 color 
FROM (VALUES (0, 'Red'), 
       (1, 'Green'), 
       (2, 'Yellow')) colors(id, color) 
ORDER BY NEWID() 
+1

您需要使子查询相关,以便对每行重新评估。 'WHERE COALESCE(ac1.object_id,ac2.object_id,ac1.column_id,ac2.column_id)不是NULL ORDER BY NEWID()'似乎是为我做的。 –

回答

3

像这样的事情也许

select ac1.ID, r.color from 
(SELECT TOP (100) 
-- changed because it didn't work in mssql 2012 
--ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as ID, 
ROW_NUMBER() OVER (ORDER BY newid()) as ID, 
ROW_NUMBER() OVER (ORDER BY newid()) as dummy 
FROM sys.all_columns 
order by id 
) ac1 
cross apply 
(SELECT top 1 color FROM (VALUES (0,'Red'),(1,'Green'),(2,'Yellow')) colors(id,color) 
where id = dummy % 3 
) r 
+0

对我来说,2012年只是给出了重复模式。例如'RGYRGYRGYRGY'虽然在2008年工作。 –

+0

@MartinSmith有趣,它没有任何意义。似乎是在2012年的逻辑问题。去测试它,当我得到访问2012 –

+0

@MartinSmith你是绝对正确的,改变我的脚本为mssql 2012工作以及 –