2017-10-04 3 views
1

En combinant quelques exemples, j'ai trouvé la requête suivante (les champs et les noms de tables ont été anonymisés, donc j'espère que je n'ai pas inséré de fautes de frappe).Mise à jour de plusieurs lignes avec des données aléatoires d'une autre table?

UPDATE destinationTable 
SET destinationField = t2.value 
FROM destinationTable t1 
CROSS APPLY (
    SELECT TOP 1 'SomeRequiredPrefix ' + sourceField as value 
    FROM #sourceTable 
    WHERE sourceField <> '' 
    ORDER BY NEWID() 
    ) t2 

Problème Actuellement, tous les enregistrements obtiennent la même valeur en destinationField, la valeur doit être aléatoire et différent. Il me manque probablement quelque chose ici.

Répondre

1

Voici une solution possible. Utiliser les numéros de lignes assignés par CTE aux deux tables en fonction d'un ordre aléatoire. Rejoindre les tables ensemble en utilisant ce numéro de base et mettre à jour les lignes en conséquence.

;WITH 
dt AS 
(SELECT *, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowNum 
FROM dbo.destinationtable), 
st AS 
(SELECT *, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowNum 
FROM dbo.#sourcetable) 

UPDATE dt 
SET dt.destinationfield = 'SomeRequiredPrefix ' + st.sourcefield 
FROM dt 
JOIN st ON dt.RowNum = st.RowNum 

MISE À JOUR SOLUTION

J'utilisé CROSS JOIN pour obtenir toutes les possibilités puisque vous avez moins de lignes dans la table source. Attribuez ensuite des lettres de réponse aléatoires et ne prenez qu'une ligne pour chaque champ de destination.

;WITH cte 
AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY destinationfield ORDER BY NEWID()) AS Rownum 
    FROM destinationtable 
    CROSS JOIN #sourcetable 
    WHERE sourcefield <> '' 

) 

UPDATE cte 
SET cte.destinationfield = 'SomeRequiredPrefix ' + sourcefield 
WHERE cte.Rownum = 1 

SELECT * FROM dbo.destinationtable 
+0

Ceci fonctionne mieux mais ne fait pas encore tout ce qu'il devrait. Les données sont aléatoires mais #sourcetable enregistre moins la table de destination, donc je pense à utiliser une LEFT OUTER JOIN, sinon #sourceTable limite le nombre de mises à jour de lignes dans la table des destinations. Il semble quand même important de conserver "WHERE sourceField <>" "car beaucoup d'enregistrements source ont '' dans sourceField. – TTT

+0

Pourtant, êtes-vous sûr que c'est "UPDATE dt"? "Pas UPDATE destinationtable"? – TTT

+0

@TTT Combien d'enregistrements y a-t-il dans chaque table? – SQLChao