2011-04-04 12 views
9

Quiero agregar un valor aleatorio a una columna en una consulta utilizando T-SQL para Microsoft SQL Server 2008 R2. Para hacer esto, utilizo una subconsulta y retiro un registro aleatorio. Cada vez que ejecuto la consulta, extrae un nuevo registro aleatorio, pero el valor de cada fila es idéntico.El uso de subconsulta para extraer el valor aleatorio revela el mismo valor cada vez

¿Cómo puedo obtener un nuevo valor aleatorio para cada fila?

Consulta de ejemplo:

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

Mientras miradas Tabla2 como

column1 
value1 
value2 
value3 

Siempre devuelve el mismo valor para columna2, en lugar de un nuevo registro aleatorio para cada tabla.

Primera carrera:

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

segunda pasada:

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

¿Cómo puedo obtener c2 (la subconsulta) para tirar de un nuevo registro aleatorio para cada fila?

escenario ideal:

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

Probablemente necesite hacer referencia a la consulta externa para que SQL Server considere que está correlacionada. Sin embargo, esto será bastante ineficiente. ¿Cuál es el requisito aquí? –

+1

¿Qué es SQL Server 2010? –

+0

Gracias @PeterSchofield, quise decir 2008 r2. – Lucas

Respuesta

16

Probar:

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

Voy a adivinar que esta es la opción de mayor rendimiento, ya que no requiere ninguna función de análisis de texto. Gracias. – Lucas

+1

Lo mismo ocurre con una declaración de actualización. p.ej. 'update table set fkId = (seleccione top 1 id de otherTable order por newId()', sería 'update t1 set fkId = (seleccione top 1 t2.id de otherTable t2 donde t1.col = t2.col ordena por newId () de la tabla t1' –

5

podría intentar

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

para forzarlo a volver a evaluar la selección cada vez. Sin embargo, esto será muy ineficiente. ¡También bastante frágil (sin el LEN no funcionó!) ¿Cumpliría con su requisito de ordenar los valores de T2 aleatoriamente una vez (o posiblemente más si Table1 es más grande que Table2) y luego unir por row_number?

La principal diferencia que puedo ver con los métodos es que su método actual permitirá que se seleccione la misma fila aleatoria varias veces que mi método propuesto no lo haría.

+0

¡Ineficiente está bien para esta situación, así que esto debería funcionar perfectamente! – Lucas

+1

Gracias por la mención de la reevaluación, este es el meollo del asunto y hace de esto la mejor respuesta. –

Cuestiones relacionadas