Sql 使用随机场更新表

Sql 使用随机场更新表,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在编写一个数据混淆器脚本。我想用假数据更新表中的每条记录。我有一个带有位置的表,并试图从该表中选择一个随机记录来更新person表中的记录。所以SQL与此类似 UPDATE Person SET City = (SELECT TOP 1 City FROM z.CityStateZip c2 ORDER BY Newid()) 问题是它只选择了一个城市,而不是为每个人随机选择一个城市。我也试过了 (SELECT TO

我正在编写一个数据混淆器脚本。我想用假数据更新表中的每条记录。我有一个带有位置的表,并试图从该表中选择一个随机记录来更新person表中的记录。所以SQL与此类似

UPDATE Person
SET    City = (SELECT TOP 1 City
               FROM   z.CityStateZip c2
               ORDER  BY Newid()) 
问题是它只选择了一个城市,而不是为每个人随机选择一个城市。我也试过了

(SELECT TOP 1 City FROM z.CityStateZip c2 ORDER BY NEWID()), PersonId, from Person
但它仍然只选择了一个城市,我以为子查询会为每个记录运行一次,而不是我想要的——每个记录随机选择一个城市

我也尝试过做一个结果相同的加入,只有一个城市被选中

SELECT t.City,
       PersonId
FROM   Person
       INNER JOIN (SELECT TOP 1 City
                   FROM   z.CityStateZip c2
                   ORDER  BY Newid()) t
               ON 1 = 1 
我试图将此语句插入函数中,但SQL Server不允许我在函数中使用NEWID

答复

我修改了Giorgi的答案和链接问题的答案,并得出了这个结论,非常快!我改变了随机选择城市的方式。纽伊德的命令是个问题。所以Person有5k条记录,CityStateZip有约30K条记录,我把它从40秒减少到了4秒……现在,如果没有count子查询,速度会更快

DECLARE @count bigint 
SELECT @count = count(*) from z.CityStateZip

UPDATE p
SET p.City= b.City
FROM Person p
CROSS APPLY (SELECT TOP 1 City -- if Id is unique, top 1 shouldn't be necessary
             FROM z.CityStateZip 
             WHERE p.SomeKey = p.SomeKey and -- ... the magic! ↓↓↓
             Id = (Select ABS(Checksum(NewID()) % @count))) b

您应该强制数据库引擎为每一行计算新值。您可以通过在外部表上添加dummy where子句来实现这一点,如:

DECLARE @city TABLE(ID INT IDENTITY(1, 1), City VARCHAR(100))

INSERT INTO @city VALUES
('Dallas'),
('New York'),
('Washington'),
('Las Vegas')


DECLARE @random TABLE(ID INT IDENTITY(1, 1), City VARCHAR(100))

INSERT INTO @random VALUES
('Manchester'),
('London'),
('Oxford'),
('Liverpool')


SELECT * FROM @city c
CROSS APPLY(SELECT TOP 1 * FROM @random r WHERE c.ID = c.ID ORDER BY NEWID()) ca

如果删除其中的c.ID=c.ID,则所有行的值都相同。

请尝试连接到派生表,而不是子选择。@Tab,我也尝试了,但没有成功。@Jeroen感谢您的链接。这似乎是重复的。我的谷歌技能让我失望了。尽管它是一个复制品,但它仍然是一个值得的复制品。这没关系,我也经历过很多次。我已经对你的问题投了赞成票。问得好的副本有一个目的:其他使用你的术语的人在搜索后也会在这里登陆,从而找到有答案的副本。谢谢Giorgi,我能够让这一点起作用,以及dup问题的答案。有没有更有效的方法?交叉应用和NEWID非常慢。我想我可以使用TableSample,但这并不能给我真正的随机结果。看看我的编辑,我可以将速度提高几个数量级