2017-10-04 41 views
1

结合一些例子,我想出了以下查询(字段和表名已匿名,所以我希望我没有插入错别字)。用另一个表中的随机数据更新多行?

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 

问题 目前,所有记录得到相同价值为destinationField,值必须是随机的,不同的。我可能在这里错过了一些东西。

回答

1

这是一个可能的解决方案。使用CTE根据随机顺序将行号分配给两个表。使用该rownumber将表连接在一起,并相应地更新行。

;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 

更新的解决方案

我以前CROSS JOIN让所有的可能性,因为你必须在源表中的行数更少。然后分配随机的rownumbers,每个目的地字段只需要1行。

;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

这是更好的工作,但还没有做它应该做的一切。数据是随机的,但#sourcetable尽可能少记录目标表,因此我正在考虑使用LEFT OUTER JOIN,否则#sourceTable会限制目标表中的行更新次数。仍然保持“WHERE sourceField <>''”是很重要的,因为很多源记录在sourceField中都有''。 – TTT

+0

你确定它是“UPDATE dt”吗? “不更新目的地表”? – TTT

+0

@TTT每个表中有多少条记录? – SQLChao

相关问题