Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

TSQL teilt die Ergebnismenge gleichmäßig in Gruppen auf und aktualisiert sie

Ich war mir nicht sicher, ob Sie wirklich eine Aktualisierungsabfrage oder eine Auswahlabfrage wollten. Die folgende Abfrage gibt für jede Bestellung einen neuen Operator zurück, abhängig von Ihren Bedingungen:

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

Es hat den Zeilen für den Join im Grunde eine neue ID zugewiesen. Der Auftragstabelle wird ein Wert zwischen 1 und der Anzahl der Operatoren zufällig zugewiesen. Diese wird dann mit einer Sequenznummer auf den Operatoren verbunden.

Wenn Sie aktualisieren müssen, können Sie Folgendes tun:

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

Ihre zwei Fragen:

Ist es besser, zuerst alle Aufträge und alle Operatoren auszuwählen, die die Bedingungen für die temporäre Tabelle erfüllen, und dann das Mischen durchzuführen, oder alles in einer großen Abfrage zu erledigen?

Die Verwendung von temporären Tabellen ist eine Frage der Leistung und Anforderungen an die Anwendung. Wenn die Daten schnell aktualisiert werden, ist die Verwendung einer temporären Tabelle ein großer Gewinn. Wenn Sie die Randomisierung viele, viele Male mit denselben Daten ausführen, kann dies ein Gewinn sein, insbesondere wenn die Tabellen zu groß sind, um in den Speicher zu passen. Andernfalls ist bei einem einmaligen Durchlauf wahrscheinlich kein großer Leistungsgewinn zu verzeichnen, vorausgesetzt, Sie setzen die Bedingungen in die innersten Unterabfragen. Wenn jedoch die Leistung ein Problem darstellt, können Sie die beiden Ansätze testen.

Ich möchte Arrays oder Gruppen als Parameter an meine Prozedur übergeben. Welche Option wäre die beste, um ein Array an eine gespeicherte Prozedur zu übergeben (SQL Server 2005).

Hmmm, wechseln Sie zu 2008, das Tabellenwertparameter hat. Hier ist ein Referenzartikel zu diesem Thema von Erland Sommarskog:http:// www.sommarskog.se/arrays-in-sql-2005.html .