我有这个查询
UPDATE f1
SET col = (SELECT ABS(300 + RANDOM() % 3600))
使用300到3600之间的随机数更新“col”列。 但它为所有行返回相同的随机数。有没有办法用不同的随机数更新行?
答案 0 :(得分:8)
它使用相同的随机数,因为子查询只需要为UPDATE运行一次。换句话说,SQL引擎知道内部SELECT只需要为查询运行一次;它会这样做,并使用每行的结果值。
您实际上不需要子查询。这将做你想要的:
UPDATE f1
SET col = ABS(300 + RANDOM() % 3600);
但是如果由于某种原因你真的想要一个子查询,你只需要确保它依赖于正在更新的表中的行。例如:
UPDATE f1
SET col = (SELECT (col*0) + ABS(300 + RANDOM() % 3600));
答案 1 :(得分:0)
我建议添加一个WHERE子句,在该子句中使用属性来区分行。 例如,假设您有一个row_id列,并且您只想更新row_id中包含1的行,那么您使用的代码将类似于:
UPDATE f1
SET col = (SELECT ABS(300 + RANDOM() % 3600))
WHERE row_id = 1
结果表格如下:
row_id | col |
1 | 200 |
“col”列中的值对应于随机数。
答案 2 :(得分:0)
你也可以在oracle数据库中尝试这个对我有用的东西。 例如,如果您想使用RPAD获得四位数的随机数,请使用下面的查询:
Update tableName set ColName=RPAD(round(dbms_random.value(0,9999)),4,'0');
答案 3 :(得分:-1)
您可以尝试通过编写SQL过程来解决问题,如下所示:
DELIMITER $$
CREATE PROCEDURE proc_name()
BEGIN
DECLARE c int ;
SET c = 1 ;
WHILE c< (SELECT MAX(row_id) FROM f1) DO
UPDATE f1
SET col = SELECT ABS(300 + RANDOM() % 3600)
WHERE row_id = c;
SET c = c + 1 ;
END WHILE ;
END $$
DELIMITER ;