使用随机行值更新每一行

时间:2013-12-06 17:48:31

标签: sql sql-server-2008

我正在尝试使用另一个表中的随机行更新表的每一行(MSSQL 2008)。

首先创建数据:

CREATE TABLE #Name
(
    Name NVARCHAR(MAX)
)
INSERT INTO #Name VALUES ('Joe'), ('Bloggs'), ('John'), ('Smith')
SELECT * INTO #Name2 FROM #Name

然后将#Name.Name设置为#Name2.Name的随机行:

UPDATE #Name SET #Name.Name=(SELECT TOP 1 Name FROM #Name2 ORDER BY NEWID())

#Name.Name始终是相同的值:

SELECT * FROM #Name

Name
----
Joe
Joe
Joe
Joe

如何更改SQL以使#Name.Name是随机的?

1 个答案:

答案 0 :(得分:1)

因为根据定义,表是一组无序的行,所以我并没有真正看到以“随机”顺序重新排序数据的重点,特别是在没有任何其他列的情况下,这里只有一个模式来实现这一目标:

;WITH n1 AS (SELECT Name, rn = ROW_NUMBER() OVER (ORDER BY Name)    FROM #Name),
      n2 AS (SELECT Name, rn = ROW_NUMBER() OVER (ORDER BY NEWID()) FROM #Name2)
UPDATE n1 SET Name = n2.Name
  FROM n1 INNER JOIN n2 ON n1.rn = n2.rn;

请注意,这假设您只需要应用一次所有名称,而不是真正的随机(这将允许多次选择相同的名称)。