2016-08-04 95 views
0

我有一组值(不连续)在表B(编号)需要随机更新一列。但随机值列举

我需要用这些值随机更新TableA列。

这个查询会做我想要的吗?

update TableA set column1 = (select id from TableB order by rand() limit 1) 

这是正确的方法吗?

+0

“TableA”的'Column1'中的当前值是什么?我用目前的方法看到的问题是,您最终可能会使用相同的值两次。 –

+0

您当前的查询会将'TableA'中所有行中的所有'column1'字段设置为从'TableB'中随机选择的同一个'id'值。目前还不清楚这是否是你想要的 - 请澄清。 – Synchro

+0

谢谢@Synchro我使用Mysql。所以它运行良好。它不填充相同的值。 –

回答

0

关于你提出的声明:

update TableA set column1 = (select id from TableB order by rand() limit 1) 

其行为是有点不可预知的。我期望它只运行一次子查询,然后用它提供的值更新TableA的所有行,但显然MySql 确实为运行子查询tableA的每个记录。

但是,您仍然会得到TableB的一些值,这些值分配给TableA的几行。如果你不希望发生这种情况,它会变得更加复杂。

如果您TableA具有独特id场,我建议这样的:

update  TableA 
inner join (select id, @rnA := @rnA + 1 as rnA 
      from TableA, 
        (select @rnA := 0) init 
      ) orderA 
     on TableA.id = orderA.id 
inner join (select id, @rnB := @rnB + 1 as rnB 
      from (select * from TableB order by rand()) randB, 
        (select @rnB := 0) init 
      ) orderB 
     on rnB = rnA   
set  TableA.column1 = orderB.id; 

两个子选择orderAorderB添加一个额外的列:rnArnB,这是从1开始顺序编号。

连接条件要求这两个值相等。这将使得一个记录匹配来自TableA的最多一条记录。由于TableB首先按随机顺序重新排序,结果将是你所期望的。

+0

非常感谢@trincot –

+0

不客气。 – trincot