2011-04-04 8 views
9

Microsoft SQL Server 2008 R2 için T-SQL kullanarak bir sorgudaki bir sütuna rastgele bir değer eklemek istiyorum. Bunu yapmak için bir alt sorgu kullanırım ve rasgele bir kayıt çekerim. Her sorguyu çalıştırdığımda, yeni bir rasgele kayıt çeker, ancak her satırın değeri aynıdır.Rastgele değeri almak için alt sorguyu kullanmak her seferinde aynı değeri gösterir

Her satır için yeni bir rasgele değer nasıl alabilirim?

Örnek sorgu:

column1 
value1 
value2 
value3 

Her zaman Sütun2 için aynı değeri döndürür gibi table2 görünüyor Oysa

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

yerine her tablo için yeni bir rastgele kaydının.

İlk çalıştırma:

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

İkinci çalışma:

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

nasıl c2 (alt sorgu) her satır için yeni bir rastgele kayıt çekmek için alabilirim?

İdeal senaryo:

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

SQL Server'ın ilişkili olduğunu düşündüğü için dış sorguya başvurmanız gerekebilir. Ancak bu oldukça etkisiz olacaktır. Buradaki gereksinim nedir? –

+1

SQL Server 2010 Nedir? –

+0

Teşekkürler @PeterSchofield, 2008 r2'yi kastettim. – Lucas

cevap

16

Dene:

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

Herhangi bir metin ayrıştırma işlevi gerektirmediğinden, bunun en yüksek performanslı seçenek olduğunu tahmin edeceğim. Teşekkür ederim. – Lucas

+1

Aynı güncelleme bildirimi için de geçerlidir. Örneğin. "update table set fkId = (newId()' tarafından otherTable düzeninden en iyi 1 kimliği seç), "update t1 set fkId =" (buradaki otherTable t2 öğesinden en üstteki 1 t2.id'i seçin) t1.col = t2.col newId tarafından düzenlenir () tablodan t1 ' –

5

Sen

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

Her defasında seçimi yeniden değerlendirmek zorlamak için deneyebilirsiniz. Ancak bu çok verimsiz olacak. Ayrıca oldukça kırılgan (LEN olmadan işe yaramadı!) T2 değerlerini rasgele bir kez (ya da Tablo1 Tablo2'den büyükse daha fazla) sıralamak için gereksiniminizi karşılar mı?

Yöntemlerle görebildiğim en önemli fark, şu anki yönteminizin, önerilen yöntemin yapamayacağı bir çok kez aynı rastgele sıranın seçilmesine izin vermesidir.

+0

Verimsiz, bu durum için iyi, bu yüzden bu mükemmel çalışmalıdır! – Lucas

+1

Yeniden değerlendirme sözü için teşekkürler, bu konunun kalbinde yer alır ve bunu en iyi cevabı yapar. –

İlgili konular