Xin lỗi vì tiêu đề khó hiểu, tôi không chắc nên viết gì ở đó.
Tôi có một bảng vài trăm hồ sơ. Tôi cần gán từng bản ghi của bảng này cho một bảng người dùng động nhỏ hơn nhiều và người dùng nên thay thế cho bản ghi nào họ được chỉ định.
Ví dụ: nếu TableA là
Row_Number () Id 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
và TableB là
Row_Number () Id 1 1 2 2 3 3
Tôi cần một tập kết quả cuối cùng
UserId RecordId 1 1 2 2 3 3 1 4 2 5 3 6 1 7 2 8 3 9 1 10
Tôi đã quản lý để làm một cái gì đó hơi lộn xộn bằng cách sử dụng toán tử mod, nhưng tôi tò mò liệu cùng một truy vấn này có thể được chạy mà không có bảng tạm thời và biến.
Bảng tạm thời được sử dụng vì TableA thực sự là Hàm do người dùng xác định để chuyển đổi một chuỗi được phân tách bằng dấu phẩy thành bảng và tôi cần Đếm các đối tượng từ UDF.
-- Converts a comma-delimited string into a table
SELECT Num as [UserId], Row_Number() OVER (ORDER BY (SELECT 1)) as [RowNo]
INTO #tmpTest
FROM dbo.StringToNumSet('2,3,1', ',')
DECLARE @test int
SELECT @test = Count(*) FROM #tmpTest
SELECT *
FROM #tmpTest as T1
INNER JOIN (
SELECT Top 10 Id, Row_Number() OVER (ORDER BY SomeDateTime) as [RowNo]
FROM TableA WITH (NOLOCK)
) as T2 ON T1.RowNo = (T2.RowNo % @test) + 1
Điều quan trọng là UserIds cũng thay thế. Tôi không thể chỉ định 1/3 bản ghi trên cùng cho Người dùng1, 1/3 bản ghi thứ hai cho Người dùng2 và 1/3 của bản ghi cho Người dùng3.
Ngoài ra, UserIds cần duy trì thứ tự mà chúng được nhập vào ban đầu, đó là lý do tại sao tôi có một bảng Row_Number() OVER (ORDER BY (SELECT 1))
trong Người dùng
Có cách nào để nối các bảng này trong một truy vấn không nên tôi sẽ không cần sử dụng bảng tạm thời và biến?
Tôi đang sử dụng SQL Server 2005
Count(*)
vớiOVER()
để có được một số kỷ lục mà không thực sự nhóm các hồ sơ. Điều này cho phép tôi thoát khỏi cả bảng tạm thời và biến, cảm ơn bạn :)