2015-05-29 14 views
6

xem xét dữ liệu này:Cập nhật bảng sử dụng ngẫu nhiên của nhiều giá trị trong bảng khác

CREATE TABLE #Data (DataID INT, Code VARCHAR(2), Prefix VARCHAR(3)) 

INSERT INTO #Data (DataID, Code) 
VALUES (1, 'AA') 
, (2, 'AA') 
, (3, 'AA') 
, (4, 'AA') 
, (5, 'AA') 
, (6, 'AA') 

CREATE TABLE #Prefix (Code VARCHAR(2), Prefix VARCHAR(3)) 

INSERT INTO #Prefix (Code, Prefix) 
VALUES ('AA', 'ABC') 
, ('AA', 'DEF') 
, ('AA', 'GHI') 
, ('AA', 'JKL') 

Tôi muốn thiết lập giá trị Prefix trong #Data là một ngẫu nhiên Prefix từ #Prefix với một phù hợp với Code.

Sử dụng một thẳng inner join chỉ dẫn đến một giá trị được sử dụng:

UPDATE D 
SET Prefix = P.Prefix 
FROM #Data AS D 
INNER JOIN #Prefix AS P ON D.Code = P.Code 

Từ đọc các câu hỏi khác về đây, NEWID() được khuyến cáo như là một cách để đặt hàng một cách ngẫu nhiên một cái gì đó. Thay đổi join tới:

SELECT TOP 1 subquery ordering by NEWID() 

vẫn chỉ chọn một giá trị duy nhất (mặc dù ngẫu nhiên mỗi lần) cho mỗi hàng:

UPDATE D 
SET Prefix = (SELECT TOP 1 P.Prefix FROM #Prefix AS P WHERE P.Code = D.Code ORDER BY NEWID()) 
FROM #Data AS D 

Vì vậy, tôi không chắc chắn làm thế nào để có được một tiền tố ngẫu nhiên cho mỗi nhập dữ liệu từ một câu lệnh cập nhật duy nhất. Tôi có thể có thể làm một số loại vòng lặp thông qua các bảng #Data, nhưng tôi tránh bao giờ chạm vào vòng trong SQL và tôi chắc chắn rằng sẽ được làm chậm. Ứng dụng thực tế này sẽ có trên hàng chục nghìn bản ghi, với hàng trăm tiền tố cho hàng tá mã.

Trả lời

8

Đây là cách để làm điều đó:

UPDATE d SET Prefix = ca.Prefix 
FROM #Data d 
CROSS APPLY(SELECT TOP 1 Prefix 
      FROM #Prefix p 
      WHERE d.DataID = d.DataID AND p.Code = d.Code ORDER BY NEWID()) ca 

Thông báo d.DataID = d.DataID. Đây là ở đây để buộc Sql Server động cơ đánh giá lại truy vấn phụ cho mỗi hàng trong bảng #Data.

Các vấn đề liên quan