このクエリがあります
UPDATE f1
SET col = (SELECT ABS(300 + RANDOM() % 3600))
300 から 3600 の間の乱数で「col」列を更新します。ただし、すべての行に対して同じ乱数を返します。行を異なる乱数で更新する方法はありますか?
サブクエリは UPDATE のために 1 回だけ実行する必要があるため、同じ乱数を使用しています。つまり、SQL エンジンは、クエリに対して内部 SELECT を 1 回だけ実行する必要があることを認識しています。そうし、各行の結果の値を使用します。
実際にはサブクエリは必要ありません。これはあなたが望むことをします:
UPDATE f1
SET col = ABS(300 + RANDOM() % 3600);
ただし、何らかの理由で本当にサブクエリが必要な場合は、更新されるテーブル内の行に依存していることを確認する必要があります。例えば:
UPDATE f1
SET col = (SELECT (col*0) + ABS(300 + RANDOM() % 3600));
また、Oracleデータベースで私のために働いたこれを試すこともできます. たとえば、RPAD を使用して 4 桁の乱数を取得する場合は、次のクエリを使用します。
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 ;