2015-05-29 6 views
6

Considerate questi dati:tavolo aggiornamenti tramite casuale di valori multipli in altra tabella

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') 

voglio impostare il valore Prefix in #Data essere un caso Prefix da #Prefix con un corrispondente Code.

Utilizzando una scala inner join solo si traduce in un valore in uso:

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

Leggendo le altre domande su qui, NEWID() è raccomandato come un modo di ordinare in modo casuale qualcosa. Cambiare il join a:

SELECT TOP 1 subquery ordering by NEWID() 

ancora seleziona solo un singolo valore (anche se casuale ogni volta) per ogni riga:

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 

Quindi, io non sono sicuro di come ottenere un prefisso casuale per ogni inserimento dati da una singola dichiarazione di aggiornamento. Potrei probabilmente fare un qualche tipo di loop attraverso il tavolo #Data, ma evito di toccare mai i loop in SQL e sono sicuro che sarebbe lento. L'effettiva applicazione di questo sarà su decine di migliaia di record, con centinaia di prefissi per dozzine di codici.

risposta

8

Questo è come farlo:

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 

Avviso d.DataID = d.DataID. Questo è qui per forzare il motore Sql Server per rivalutare la sottoquery per ogni riga nella tabella #Data.