Sql server 是否使用另一个表中的随机数据更新多行?
结合一些例子,我提出了以下查询字段和表名已匿名,希望我没有插入拼写错误Sql server 是否使用另一个表中的随机数据更新多行?,sql-server,random,sql-update,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 <> ''
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中获得相同的值,值需要是随机的和不同的。我可能遗漏了一些东西。这里有一个可能的解决方案。使用CTE根据随机顺序为两个表分配行号。使用该行号将表连接在一起,并相应地更新行
;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
更新的解决方案
由于源表中的行数较少,所以我使用交叉连接来获得所有可能的结果。然后分配随机行号,每个目标字段只取一行
;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
这是更好的工作,但还没有做到它应该做的一切。数据是随机的,但sourcetable对目标表的记录要少得多,因此我考虑使用左外部联接,否则sourcetable会限制目标表中行更新的数量。尽管如此,保持sourceField的位置似乎很重要,因为sourceField中有很多源记录。但您确定它是更新dt吗?不更新destinationtable?在ST:3.000中,但实际上很多,其中sourceField=[空白字符串]。在DT~82.000中。现在,我选择了一个游标而不是一个查询。@TTT我添加了另一个可能的解决方案。通过这个解决方案,我得到了547行受影响的数据,而我应该得到82067行受影响的数据。另外,游标的执行时间是00:19,更新后的解决方案的执行时间是00:55,所以现在我将使用游标。