Sql 使用随机值更新表
我有两张表,比如说表1(Col1,Col2,Col3,Col4)和表2(Col1) 我想更新表1中的一些COL 对于表1中Col1以“001”结尾的每一行(假设所有值至少为长度4),我想: 1.将集合(10,20,30,40,50,60,70,80,90)中的随机数放入Col2 2.在Col3中放置一个随机的9位数字 3.将表2 Col1中的随机值放入表1 Col4中 我该怎么做Sql 使用随机值更新表,sql,sql-server,tsql,random,Sql,Sql Server,Tsql,Random,我有两张表,比如说表1(Col1,Col2,Col3,Col4)和表2(Col1) 我想更新表1中的一些COL 对于表1中Col1以“001”结尾的每一行(假设所有值至少为长度4),我想: 1.将集合(10,20,30,40,50,60,70,80,90)中的随机数放入Col2 2.在Col3中放置一个随机的9位数字 3.将表2 Col1中的随机值放入表1 Col4中 我该怎么做 谢谢 我认为这可以让你走上正确的道路 构建一个样本数据表,其中的数字递增,以满足您的需要。您可以使用循环,但如果您要
谢谢 我认为这可以让你走上正确的道路 构建一个样本数据表,其中的数字递增,以满足您的需要。您可以使用循环,但如果您要做许多行,则or将快得多。然后,使用示例数据
ORDER BY NEWID()
更新表1
的相应列。这将随机化选择集的顺序
UPDATE Table1
SET Col1 = (SELECT TOP 1 RandomColumn1
FROM SampleData
ORDER BY NEWID())
您还可以查看是否适合您。我有,但从未使用过。我倾向于使用这样的东西:
WITH SampleData (entity_number, entity_name)
AS (
... row constructors here...
),
SampleDataOrdered (order_col, entity_number, entity_name)
AS (
SELECT ROW_NUMBER() OVER(ORDER BY NEWID()),
S1.entity_number, S1.entity_name
FROM SampleData AS S1
)
MERGE INTO MyBaseTable...;
创建表MyTable(
RowID int标识(1,1),Col1 int, Col2 int, Col3 int, Col4 int。 )
DECLARE@RowCount int,
@数字记录int
从mytable中选择@NumberRecords=count(*)
设置@RowCount=1
而@RowCount我更喜欢使用基于集合的解决方案。这是我开发的基于集合的解决方案。我对它进行了测试,效果良好
Update Table1
Set Col2 = (Cast(CAST(newid() AS binary(1)) AS int) % 9 + 1) *10
Where Substring(Table1.Col1,len(Table1.Col1)-2,3) = '001'
Update Table1
Set Col3 = Cast(CAST(newid() AS binary(3)) AS int)
Where Substring(Table1.Col1,len(Table1.Col1)-2,3) = '001'
Create table #temp1(tCol1 varchar(50),
tCol2 varchar(10),randomnum varchar(max) )
Insert Into #temp1
Select Table1.Col1,Table2.Col1,newid() as random1
From Table1
Cross Join Table2
Where Substring(Table1.Col1,len(Table1.Col1)-2,3) = '001'
Update Table1
Set Table1.Col4 = tCol2
From (
Select tCol1,tCol2,a.randomnum
From (
Select Max(randomnum) As randomnum
From #temp1 Group By tCol1
) a
Left Join #temp1 On a.randomnum = #temp1.randomnum
) b
Inner Join Table1 On b.tCol1 = Table1.Col1
Drop table #temp1
我更愿意运行下面的代码,等待某个时间运行并更新随机值
while 1=1
BEGIN
UPDATE top (10) a
SET value =rand() * 100
from (select top 10 * from
MyTable
order by newid()
) a
END
除非使用top1,否则不能在子查询中使用order by子句,这将导致在每个记录中放置相同的随机值。@kralco,添加TOP 1
不会在每个字段中放置相同的值,因为指定了order by NEWID()
。但是,我正在根据您的其他观察结果进行修改(在没有TOP的子查询中不能有ORDER BY
)@kralco,我明白了;这一定是因为TOP 1
查询只执行了一次。当我只测试那条语句时,每次执行我都会收到不同的结果。@kralco,在处理解决方案时,我遇到了很多限制,需要创建很多依赖项(计数表
,视图
,用于获取NEWID()
,一个生成随机数的函数)。我会去别处看看;抱歉,我无法帮助。Top 1查询将只运行一次,并根据返回的值更新列。在我的脑海中,你可以创建一个RowID列(递增的数字)来获取列的最小/最大值,在这里,你的更新和使用while 1:1循环,每次递增一个计数器变量,直到你达到与max row-id相同的值。我正在试着弄明白你的意思。你能说得更具体些吗?如何使用表2 col1中的随机值更新表1 col4?谢谢在你发布这篇文章之前,我开发了一个基于集合的解决方案。非常感谢你的帮助+1“这是基于集合的解决方案”:您正在使用三个更新和一个暂存表。呃,这不是一种程序性的方法吗?因为我只更新了350行,所以我觉得没有必要合并成一个步骤。但我当然可以,如果这对某人有帮助的话。。。也。除非使用With table…,否则暂存台是不可避免的。。。。无论哪种方式,临时表或表变量或它的调用在逻辑上都是相同的。必须多次引用非确定性查询的同一实例。你必须把它保存在某个地方。。。
while 1=1
BEGIN
UPDATE top (10) a
SET value =rand() * 100
from (select top 10 * from
MyTable
order by newid()
) a
END