4

このクエリがあります

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

300 から 3600 の間の乱数で「col」列を更新します。ただし、すべての行に対して同じ乱数を返します。行を異なる乱数で更新する方法はありますか?

4

4 に答える 4

8

サブクエリは UPDATE のために 1 回だけ実行する必要があるため、同じ乱数を使用しています。つまり、SQL エンジンは、クエリに対して内部 SELECT を 1 回だけ実行する必要があることを認識しています。そうし、各行の結果の値を使用します。

実際にはサブクエリは必要ありません。これはあなたが望むことをします:

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 を使用して 4 桁の乱数を取得する場合は、次のクエリを使用します。

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 に答える