4

我有这个查询

UPDATE f1
SET col = (SELECT ABS(300 + RANDOM() % 3600))

用 300 到 3600 之间的随机数更新“col”列。但它为所有行返回相同的随机数。有没有办法用不同的随机数更新行?

4

4 回答 4

8

它使用相同的随机数,因为子查询只需要为 UPDATE 运行一次。换句话说,SQL 引擎知道内部的 SELECT 查询只需要运行一次;它这样做,并为每一行使用结果值。

您实际上不需要子查询。这将做你想要的:

UPDATE f1
SET col = ABS(300 + RANDOM() % 3600);

但是如果出于某种原因你真的想要一个子查询,你只需要确保它依赖于正在更新的表中的行。例如:

UPDATE f1
SET col = (SELECT (col*0) + ABS(300 + RANDOM() % 3600));
于 2013-08-09T13:32:28.700 回答
0

你也可以试试这个在 oracle 数据库中对我有用的方法。例如,如果您想使用 RPAD 获得四位随机数,请使用以下查询:

Update tableName set ColName=RPAD(round(dbms_random.value(0,9999)),4,'0');

于 2018-06-19T09:48:35.773 回答
-1

我建议添加一个 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”列中的值将对应于随机数。

于 2013-08-09T10:42:28.373 回答
-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 ;
于 2013-08-09T10:58:23.573 回答