Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

TSQL divide equamente il set di risultati in gruppi e li aggiorna

Non ero sicuro se volessi davvero una query di aggiornamento o una query di selezione. La seguente query restituisce un nuovo operatore per ogni ordine, soggetto alle tue condizioni:

/*
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 

Fondamentalmente ha assegnato un nuovo ID alle righe per il join. La tabella degli ordini ottiene un valore compreso tra 1 e il numero di operatori, assegnati casualmente. Questo viene quindi unito a un numero di sequenza sugli operatori.

Se devi aggiornare, puoi fare qualcosa come:

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

Le tue due domande:

Sarà meglio selezionare prima tutti gli ordini e tutti gli operatori che soddisfano le condizioni per la tabella temporanea e quindi eseguire il rimescolamento o fare tutto in una grande query?

L'utente di tabelle temporanee è una questione di prestazioni e requisiti per l'applicazione. Se i dati vengono aggiornati rapidamente, sì, l'utilizzo di una tabella temporanea è una grande vittoria. Se stai eseguendo la randomizzazione molte, molte volte sugli stessi dati, può essere una vittoria, in particolare se i tavoli sono troppo grandi per stare in memoria. In caso contrario, è probabile che non ci sia un grande aumento delle prestazioni in una sola volta, supponendo che tu metta le condizioni all'interno delle sottoquery più interne. Tuttavia, se le prestazioni sono un problema, puoi testare i due approcci.

Vorrei passare array o gruppi come parametro alla mia procedura. Quale opzione sarebbe la migliore per passare l'array alla stored procedure (SQL Server 2005).

Hmmm, passa al 2008 che ha parametri con valori di tabella. Ecco un articolo altamente referenziato sull'argomento di Erland Sommarskog:http:// www.sommarskog.se/arrays-in-sql-2005.html .