使用另一个表中的随机数据更新多行?

时间:2017-10-04 14:49:03

标签: sql-server random sql-update

结合一些例子,我想出了以下查询(字段和表名已被匿名化,所以我希望我没有插入拼写错误。)

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 个答案:

答案 0 :(得分:2)

这是一个可能的解决方案。使用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