Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

TSQL membagi hasil secara merata ke grup dan memperbaruinya

Saya tidak yakin apakah Anda benar-benar menginginkan kueri pembaruan atau kueri pemilihan. Kueri berikut mengembalikan operator baru untuk setiap pesanan, sesuai dengan ketentuan Anda:

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

Itu pada dasarnya menetapkan id baru ke baris untuk bergabung. Tabel pesanan mendapat nilai antara 1 dan jumlah operator, ditetapkan secara acak. Ini kemudian digabungkan ke nomor urut pada operator.

Jika Anda perlu memperbarui, Anda dapat melakukan sesuatu seperti:

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

Dua pertanyaan Anda:

Apakah lebih baik memilih semua pesanan dan semua operator yang memenuhi persyaratan ke tabel sementara terlebih dahulu, lalu melakukan pengocokan atau melakukan semuanya dalam satu kueri besar?

Pengguna tabel sementara adalah masalah kinerja dan persyaratan untuk aplikasi. Jika data diperbarui dengan cepat, maka ya, menggunakan tabel sementara adalah kemenangan besar. Jika Anda menjalankan pengacakan berkali-kali pada data yang sama, maka itu bisa menjadi kemenangan, terutama jika tabel terlalu besar untuk muat di memori. Jika tidak, kemungkinan besar tidak akan ada peningkatan kinerja yang besar dalam satu waktu, dengan asumsi Anda menempatkan kondisi di dalam subkueri terdalam. Namun, jika kinerja menjadi masalah, Anda dapat menguji kedua pendekatan tersebut.

Saya ingin meneruskan array atau grup sebagai parameter ke prosedur saya. Opsi mana yang terbaik untuk meneruskan array ke prosedur tersimpan (SQL Server 2005).

Hmmm, beralih ke 2008 yang memiliki parameter bernilai tabel. Berikut ini adalah artikel referensi tinggi tentang masalah ini oleh Erland Sommarskog: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. Mengapa SQL Server menggunakan pemindaian indeks alih-alih pencarian indeks ketika klausa WHERE berisi nilai parameter?

  2. Ukuran maksimum untuk Kueri SQL Server? klausa IN? Apakah ada Pendekatan yang Lebih Baik?

  3. Hanya mendapatkan Bulan dan Tahun dari SQL DATE

  4. Cara mengembalikan grup kosong dalam klausa SQL GROUP BY

  5. Bagaimana saya bisa mendapatkan daftar nama elemen dari nilai XML di SQL Server