sql >> Databasteknik >  >> RDS >> Sqlserver

TSQL delar upp resultatuppsättningen lika i grupper och uppdaterar dem

Jag var inte säker på om du verkligen ville ha en uppdateringsfråga eller en urvalsfråga. Följande fråga returnerar en ny operatör för varje beställning, beroende på dina villkor:

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

Den tilldelade i princip ett nytt ID till raderna för sammanfogningen. Ordningstabellen får ett värde mellan 1 och antalet operatorer, slumpmässigt tilldelade. Detta kopplas sedan till ett sekvensnummer på operatörerna.

Om du behöver uppdatera kan du göra något som:

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

Dina två frågor:

Blir det bättre att först välja alla alla beställningar och alla operatörer som uppfyller villkoren för tillfällig tabell och sedan göra blandningen eller att göra allt i en stor fråga?

Användaren av tillfälliga tabeller är en fråga om prestanda och krav på applikationen. Om data uppdateras snabbt, ja, det är en stor vinst att använda ett tillfälligt bord. Om du kör randomiseringen många, många gånger på samma data, kan det vara en vinst, särskilt om borden är för stora för att få plats i minnet. Annars är det inte troligt att det blir en stor prestandavinst på en engångskörning, förutsatt att du placerar villkoren inom de innersta underfrågorna. Men om prestanda är ett problem kan du testa de två metoderna.

Jag skulle vilja skicka array eller grupper som en parameter till min procedur. Vilket alternativ skulle vara bäst för att skicka array till lagrad procedur (SQL Server 2005).

Hmmm, byt till 2008 som har tabellvärderade parametrar. Här är en mycket referensartikel i ämnet av Erland Sommarskog:http:// www.sommarskog.se/arrays-in-sql-2005.html .



  1. JPA SequenceGenerator och GeneratedValue:namn / generatoregenskap unik endast per klass?

  2. Felkod:1064 i mysql

  3. Återställer Oracle transaktionen vid ett fel?

  4. Översikt över DBCC CheckDB-funktion