sql >> Database >  >> RDS >> Sqlserver

TSQL verdeelt de resultatenset gelijkelijk over groepen en werkt ze bij

Ik wist niet zeker of je echt een update-query of een select-query wilde. De volgende zoekopdracht levert een nieuwe operator op voor elke bestelling, afhankelijk van uw voorwaarden:

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

Het wees in feite een nieuwe id toe aan de rijen voor de join. De volgordetabel krijgt een waarde tussen 1 en het aantal operators, willekeurig toegewezen. Dit wordt dan gekoppeld aan een volgnummer op de operators.

Als je moet updaten, kun je zoiets doen als:

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

Uw twee vragen:

Is het beter om eerst alle orders en alle operators die aan de voorwaarden voldoen om tijdelijk te tafelen te selecteren en dan de shuffle te doen of alles in één grote query te doen?

De gebruiker van tijdelijke tabellen is een kwestie van prestaties en vereisten voor de toepassing. Als de gegevens snel worden bijgewerkt, ja, het gebruik van een tijdelijke tafel is een grote overwinning. Als u de randomisatie vele, vele malen op dezelfde gegevens uitvoert, kan het een overwinning zijn, vooral als de tabellen te groot zijn om in het geheugen te passen. Anders is er waarschijnlijk geen grote prestatiewinst bij een eenmalige run, ervan uitgaande dat u de voorwaarden binnen de binnenste subquery's plaatst. Als prestaties echter een probleem zijn, kunt u de twee benaderingen testen.

Ik wil array of groepen als parameter doorgeven aan mijn procedure. Welke optie zou het beste zijn om de array door te geven aan de opgeslagen procedure (SQL Server 2005).

Hmmm, schakel over naar 2008 met tabelwaardeparameters. Hier is een zeer referentieartikel over het onderwerp door Erland Sommarskog:http:// www.sommarskog.se/arrays-in-sql-2005.html .



  1. Gelijk aan unpivot() in PostgreSQL

  2. Kolom Rij Transponeren in Oracle Sql

  3. Perl DBI zonder toegang tot de database

  4. Een overzicht van vertrouwde extensies in PostgreSQL 13