2011-04-04 23 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

相關問題