结合一些例子,我想出了以下查询(字段和表名已被匿名化,所以我希望我没有插入拼写错误。)
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
中获得相同的值,值必须是随机的且不同的。我可能在这里遗漏了一些东西。
答案 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