2011-04-04 24 views
9

我想向使用Microsoft SQL Server 2008 R2的T-SQL的查询中的列添加一个随机值。为了做到这一点,我使用了一个子查询并抽出一个随机记录。每次运行查询时,它都会提取一个新的随机记录,但每行的值是相同的。使用子查询来拉取随机值,每次都显示相同的值

如何为每一行获得新的随机值?

样品查询:

SELECT column1, 
    (SELECT TOP 1 column1 as c2 FROM Table2 ORDER BY NewID()) 
FROM Table1 

而表2的样子

column1 
value1 
value2 
value3 

它总是返回列2相同的值,而不是为每个表一个新的随机记录。

首先运行:

column1, c2 
1, value1 
2, value1 
3, value1 

第二轮:

column1, c2 
1, value2 
2, value2 
3, value2 

我怎样才能获得C2(子查询)拉为每行一个新的随机记录?

理想的方案:

column1, c2 
1, value2 
2, value1 
3, value2 
+1

您可能需要引用外部查询,以便SQL Server认为它是相关的。这将是非常低效的。这里有什么要求? – 2011-04-04 16:00:54

+1

什么是SQL Server 2010? – 2011-04-04 16:01:18

+0

谢谢@PeterSchofield,我的意思是2008年r2。 – Lucas 2012-04-01 02:52:31

回答

16

尝试:

SELECT column1, 
    (SELECT TOP 1 column1 as c2 FROM Table2 WHERE Table1.column1 IS NOT NULL ORDER BY NewID()) 
FROM Table1 
+0

我猜测这是性能最高的选项,因为它不需要任何文本解析功能。谢谢。 – Lucas 2011-04-06 04:06:20

+1

更新声明也一样。例如。 'update table set fkId =(通过newId()从其他表顺序选择top 1 id',将会是'update t1 set fkId =(从其他表中选择top 1 t2.id t2其中t1.col = t2.col order by newId )from t1' – 2012-07-25 03:10:12

5

你可以尝试

SELECT T1.column1, 
    (SELECT TOP 1 column1 as c2 FROM Table2 ORDER BY LEN(T1.column1), NewID()) 
FROM Table1 T1 

,迫使它每次都重新评估选择。这将是非常低效的。也很脆弱(没有LEN它没有工作!)它会满足您的要求,随机排序T2值一次(或可能更多,如果Table1大于Table2),然后通过row_number连接?

我可以看到的主要区别在于,您的当前方法将允许多次选择相同的随机行,我建议的方法不会。

+0

对于这种情况,效率低下很好,所以这应该完美无缺! – Lucas 2011-04-04 16:35:16

+1

感谢您提及重新评估;这是问题的核心,并且使得这是最佳答案。 – 2015-05-01 06:04:07

相关问题