我有这个查询
UPDATE f1
SET col = (SELECT ABS(300 + RANDOM() % 3600))
用 300 到 3600 之间的随机数更新“col”列。但它为所有行返回相同的随机数。有没有办法用不同的随机数更新行?
它使用相同的随机数,因为子查询只需要为 UPDATE 运行一次。换句话说,SQL 引擎知道内部的 SELECT 查询只需要运行一次;它这样做,并为每一行使用结果值。
您实际上不需要子查询。这将做你想要的:
UPDATE f1
SET col = ABS(300 + RANDOM() % 3600);
但是如果出于某种原因你真的想要一个子查询,你只需要确保它依赖于正在更新的表中的行。例如:
UPDATE f1
SET col = (SELECT (col*0) + ABS(300 + RANDOM() % 3600));
你也可以试试这个在 oracle 数据库中对我有用的方法。例如,如果您想使用 RPAD 获得四位随机数,请使用以下查询:
Update tableName set ColName=RPAD(round(dbms_random.value(0,9999)),4,'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”列中的值将对应于随机数。
您可以尝试通过编写 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 ;