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

TSQL opdeler resultaterne ligeligt til grupper og opdaterer dem

Jeg var ikke sikker på, om du virkelig ville have en opdateringsforespørgsel eller en udvalgt forespørgsel. Følgende forespørgsel returnerer en ny operatør for hver ordre, underlagt dine betingelser:

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

Det tildelte grundlæggende et nyt id til rækkerne for joinforbindelsen. Ordretabellen får en værdi mellem 1 og antallet af operatører, tilfældigt tildelt. Dette er så forbundet med et sekvensnummer på operatørerne.

Hvis du har brug for at opdatere, så kan du gøre noget som:

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

Dine to spørgsmål:

Vil det være bedre først at vælge alle alle ordrer og alle operatører, der opfylder betingelserne for midlertidig tabel, og derefter foretage blandingen eller at gøre det hele i én stor forespørgsel?

Brugeren af ​​midlertidige tabeller er et spørgsmål om ydeevne og krav til applikationen. Hvis dataene opdateres hurtigt, ja, det er en stor gevinst at bruge en midlertidig tabel. Hvis du kører randomiseringen mange, mange gange på de samme data, så kan det være en gevinst, især hvis bordene er for store til at passe i hukommelsen. Ellers er der ikke sandsynlighed for en stor præstationsgevinst på en engangskørsel, forudsat at du placerer betingelserne inden for de inderste underforespørgsler. Men hvis ydeevne er et problem, kan du teste de to tilgange.

Jeg vil gerne overføre array eller grupper som en parameter til min procedure. Hvilken mulighed ville være den bedste til at overføre array til lagret procedure (SQL Server 2005).

Hmmm, skift til 2008, som har parametre med tabelværdi. Her er en meget referenceartikel om emnet af Erland Sommarskog:http:// www.sommarskog.se/arrays-in-sql-2005.html .



  1. Kan ikke konvertere MySQL.DateTime til System.DateTime med 0000-00-00 00:00:00 værdier

  2. Bestil Oracle-forespørgsel efter SUM uden at vælge SUM

  3. Inkludering af tabeller og skemaer, når du angiver identitetskolonnerne i en SQL Server-database

  4. Golang RESTful API-belastningstest forårsager for mange databaseforbindelser