sql >> Databáze >  >> RDS >> Sqlserver

TSQL rovnoměrně rozdělí sadu výsledků do skupin a aktualizuje je

Nebyl jsem si jistý, jestli opravdu chcete aktualizační dotaz nebo výběrový dotaz. Následující dotaz vrací nový operátor pro každou objednávku, s výhradou vašich podmínek:

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

V podstatě přiřadila nové id řádkům pro spojení. Tabulka pořadí získá hodnotu mezi 1 a počtem náhodně přiřazených operátorů. To je pak připojeno k pořadovému číslu na operátorech.

Pokud potřebujete aktualizovat, můžete udělat něco jako:

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

Vaše dvě otázky:

Bude lepší nejprve vybrat všechny objednávky a všechny operátory, které splňují podmínky do dočasné tabulky, a poté provést míchání, nebo to udělat vše v jednom velkém dotazu?

Uživatel dočasných tabulek je otázkou výkonu a požadavků na aplikaci. Pokud se data rychle aktualizují, pak ano, použití dočasné tabulky je velká výhra. Pokud spouštíte randomizaci mnohokrát a mnohokrát na stejných datech, může to být výhra, zvláště pokud jsou tabulky příliš velké, aby se vešly do paměti. Jinak není pravděpodobné, že při jednorázovém spuštění dojde k velkému nárůstu výkonu, za předpokladu, že podmínky vložíte do nejvnitřnějších poddotazů. Pokud je však problém s výkonem, můžete otestovat oba přístupy.

Chtěl bych předat pole nebo skupiny jako parametr mé proceduře. Která možnost by byla nejlepší pro předání pole uložené proceduře (SQL Server 2005).

Hmmm, přepněte na rok 2008, který má tabulkové parametry. Zde je vysoce referenční článek na toto téma od Erlanda Sommarskoga:http:// www.sommarskog.se/arrays-in-sql-2005.html .



  1. Způsobeno:java.sql.SQLException:Nepodporované kódování znaků 'utf8mb4'

  2. Efektivita čtvrtletního výpočtu počtu zaměstnanců

  3. čárkou oddělený seznam

  4. Chyba na T-Sql při použití kurzoru