Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

TSQL dzieli równo wyniki na grupy i aktualizuje je

Nie byłem pewien, czy naprawdę chcesz zapytanie aktualizujące, czy zapytanie wybierające. Poniższe zapytanie zwraca nowy operator dla każdego zamówienia, zgodnie z Twoimi warunkami:

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

Zasadniczo przypisał nowy identyfikator do wierszy łączenia. Tabela kolejności otrzymuje losowo przypisaną wartość od 1 do liczby operatorów. Jest on następnie dołączany do numeru sekwencyjnego operatorów.

Jeśli chcesz zaktualizować, możesz zrobić coś takiego:

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

Twoje dwa pytania:

Czy lepiej będzie najpierw wybrać wszystkie zamówienia i wszystkie operatory spełniające warunki do tabeli tymczasowej, a następnie wykonać tasowanie, czy zrobić to wszystko w jednym dużym zapytaniu?

Użytkownik tabel tymczasowych jest kwestią wydajności i wymagań stawianych aplikacji. Jeśli dane są szybko aktualizowane, to tak, użycie tabeli tymczasowej to wielka wygrana. Jeśli przeprowadzasz randomizację wiele, wiele razy na tych samych danych, może to być wygrana, szczególnie jeśli tabele są zbyt duże, aby zmieścić się w pamięci. W przeciwnym razie nie ma dużego wzrostu wydajności za jednym razem, zakładając, że umieścisz warunki w najgłębszych podzapytaniach. Jeśli jednak wydajność stanowi problem, możesz przetestować oba podejścia.

Chciałbym przekazać tablicę lub grupy jako parametr do mojej procedury. Która opcja byłaby najlepsza do przekazania tablicy do procedury składowanej (SQL Server 2005).

Hmmm, przejdź do 2008, który ma parametry o wartościach stołowych. Oto bardzo referencyjny artykuł Erlanda Sommarskoga na ten temat:http:// www.sommarskog.se/arrays-in-sql-2005.html .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy mogę utworzyć widok na moim serwerze bazy danych z innego serwera bazy danych?

  2. SQL Server konwertuje kolumnę na kolumnę tożsamości

  3. Czy mogę uzyskać nazwy wszystkich tabel bazy danych SQL Server w aplikacji C#?

  4. Zapytanie o przekształcenie SQL

  5. Dlaczego moje zapytanie SQL wstawiające wiersz tabeli nie działa poprawnie?