【问题标题】:Error when trying to update a row with a random value尝试使用随机值更新行时出错
【发布时间】:2013-06-29 08:28:39
【问题描述】:

我正在尝试使用另一个表中随机行的数据更新表中的每一行。这是我目前使用的 SQL:

SELECT Data, RowNumber FROM SampleData

SELECT FLOOR(ABS(CHECKSUM(NEWID())) / 2147483647.0 * 3 + 1) FROM Name

UPDATE Name SET Surname = (SELECT Data FROM SampleData WHERE RowNumber = FLOOR(ABS(CHECKSUM(NEWID())) / 2147483647.0 * 3 + 1))

这是我得到的结果:

Smith   1
Hunt    2
Jones   3

2
2
3
2
1
3
2
.... continues with a random number between 1 and 3 for each row in the Name table

Msg 512, Level 16, State 1, Line 9
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

所以我的问题是为什么 SELECT 语句在 UPDATE 子查询似乎返回多行的情况下每行产生一个随机数。我正在使用 SQL Server 2012 SP1,以防万一。

【问题讨论】:

  • 看看这个查询 SELECT Nr,Count() from ( Select FLOOR(ABS(CHECKSUM(NEWID())) / 2147483647.0 * 3 + 1) as Nr FROM Name ) a按具有 Count()>1 的 nr 分组
  • 不太清楚这意味着什么。结果是 3 行显示 1、2 和 3 分别返回大约三分之一的时间。但这正是我所期望的
  • 您正在将一组或结果分配给单个字段 sqlfiddle.com/#!3/d3894/8 您可以使用例如SELECT TOP 1 Data FROM SampleData .......
  • 抱歉,我看不出这有什么帮助。我正在尝试使用 SampleData 表中的随机值更新 Name 表中的 Surname 列

标签: sql-server random sql-update subquery


【解决方案1】:

您正在尝试使用一组数据更新字段,这会导致所描述的错误。

创建一个临时映射表,并通过名称的ID和SampleDate的“random” ID之间的连接更新名称

SQLFiddle

SELECT ID,FLOOR(ABS(CHECKSUM(NEWID())) / 2147483647.0 * 3 + 1) as RN
Into #tmp
FROM Name

Update Name set SurName=Data 
from #tmp
join SampleData sd on sd.RowNumber=#tmp.rn
where #tmp.ID=Name.ID

Select * from Name

【讨论】:

  • 感谢您,它运行良好。我仍然不明白为什么我的原始查询不起作用
  • 第二个查询的输出提供了许多项目,姓氏只能取一个。您正在尝试在第三个查询中将所有名称设置为子查询的所有 results。没有自动将结果分布在名称上。
猜你喜欢
  • 1970-01-01
  • 2021-07-01
  • 2018-08-14
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
相关资源
最近更新 更多