sql >> Base de Datos >  >> RDS >> Sqlserver

TSQL divide igualmente el conjunto de resultados en grupos y actualízalos

No estaba seguro de si realmente quería una consulta de actualización o una consulta de selección. La siguiente consulta devuelve un nuevo operador para cada pedido, sujeto a sus condiciones:

/*
with orders as (select 1 as orderId, 'order1' as orderDesc, 1 as OperatorId),
     operators as (select 1 as operatorID, 'John' as name)
 */
select o.*, op.name as NewOperator, op.operatorID as NewOperatorId
from (select o.*, (ROW_NUMBER() over (order by newid()) % numoperators) + 1 as randseqnum
      from Orders o cross join
     (select COUNT(*) as numoperators from operators) op
     ) o join
     (select op.*, ROW_NUMBER() over (order by newid()) as seqnum
      from Operators op
     ) op
     on o.randseqnum = op.seqnum order by orderid 

Básicamente, asignó una nueva identificación a las filas para la combinación. La tabla de pedidos toma un valor entre 1 y el número de operadores, asignados aleatoriamente. Esto luego se une a un número de secuencia en los operadores.

Si necesita actualizar, puede hacer algo como:

with toupdate as (<above query>)
update orders
    set operatorid = newoperatorid
    from toupdate
    where toupdate.orderid = orders.orderid

Tus dos preguntas:

¿Será mejor seleccionar primero todas las órdenes y todos los operadores que cumplan las condiciones de la tabla temporal y luego barajar o hacerlo todo en una gran consulta?

El usuario de las tablas temporales es una cuestión de rendimiento y requisitos de la aplicación. Si los datos se actualizan rápidamente, entonces sí, usar una tabla temporal es una gran victoria. Si está ejecutando la aleatorización muchas, muchas veces con los mismos datos, entonces puede ser una victoria, especialmente si las tablas son demasiado grandes para caber en la memoria. De lo contrario, no es probable que haya una gran ganancia de rendimiento en una sola ejecución, suponiendo que coloque las condiciones dentro de las subconsultas más internas. Sin embargo, si el rendimiento es un problema, puede probar los dos enfoques.

Me gustaría pasar matrices o grupos como parámetro a mi procedimiento. Qué opción sería la mejor para pasar la matriz al procedimiento almacenado (SQL Server 2005).

Hmmm, cambie a 2008 que tiene parámetros con valores de tabla. Aquí hay un artículo de gran referencia sobre el tema de Erland Sommarskog:http:// www.sommarskog.se/arrays-in-sql-2005.html .