Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

TSQL chia đều tập kết quả cho các nhóm và cập nhật chúng

Tôi không chắc bạn thực sự muốn truy vấn cập nhật hay truy vấn chọn lọc. Truy vấn sau đây trả về một toán tử mới cho mỗi đơn đặt hàng, tùy thuộc vào điều kiện của bạn:

/*
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ề cơ bản, nó đã gán một id mới cho các hàng để tham gia. Bảng thứ tự nhận một giá trị từ 1 đến số lượng toán tử, gán ngẫu nhiên. Sau đó, nó được kết hợp với một số thứ tự trên các toán tử.

Nếu bạn cần cập nhật, bạn có thể làm như sau:

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

Hai câu hỏi của bạn:

Sẽ tốt hơn nếu trước tiên chọn tất cả các đơn đặt hàng và tất cả các toán tử đáp ứng các điều kiện vào bảng tạm thời và sau đó thực hiện xáo trộn hay thực hiện tất cả trong một truy vấn lớn?

Người sử dụng các bảng tạm thời là vấn đề về hiệu suất và các yêu cầu đối với ứng dụng. Nếu dữ liệu đang được cập nhật nhanh chóng, thì có, sử dụng bảng tạm thời là một chiến thắng lớn. Nếu bạn đang chạy ngẫu nhiên nhiều lần trên cùng một dữ liệu, thì đó có thể là một chiến thắng, đặc biệt nếu các bảng quá lớn để vừa với bộ nhớ. Nếu không, sẽ không có khả năng đạt được hiệu suất lớn trong một lần chạy, giả sử bạn đặt các điều kiện trong các truy vấn con trong cùng. Tuy nhiên, nếu hiệu suất là một vấn đề, bạn có thể kiểm tra hai cách tiếp cận.

Tôi muốn chuyển mảng hoặc nhóm làm tham số cho thủ tục của mình. Tùy chọn nào sẽ là tốt nhất để chuyển mảng sang thủ tục được lưu trữ (SQL Server 2005).

Hmmm, chuyển sang 2008 có các tham số có giá trị bảng. Đây là một bài viết mang tính tham khảo cao về chủ đề này của 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. LỆNH SQL có điều kiện BẰNG ASC / DESC cho các cột alpha

  2. Trả lại tên đăng nhập hiện tại trong SQL Server (T-SQL)

  3. chuyển đổi tên tháng trong varchar thành ngày tháng để sắp xếp theo tháng

  4. Sử dụng chỉ mục trong bảng được tối ưu hóa bộ nhớ máy chủ SQL

  5. Có "HOẶC" trong điều kiện INNER JOIN có phải là một ý tưởng tồi không?