トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-160 各レコードをランダムに更新

SQLパズル

IsUpdatedテーブル
code1  code2
-----  ----
    1     1
    1     1
    1     1

WillUpdateテーブル
code1  code2
-----  ----
    1     1
    2     2
    3     3

IsUpdatedテーブルの各レコードを、
WillUpdateテーブルからランダムに選んだ1レコードで更新する

こちらを参考にさせていただきました


データ作成スクリプト

create table IsUpdated as
select 1 as code1 ,1 as code2 from all_catalog where RowNum <= 500;

create table WillUpdate as
select RowNum as code1 ,RowNum as code2 from all_catalog where RowNum <= 500;


SQL

declare
    counter binary_integer := to_number(to_char(systimestamp,('FF2')));
begin
    for rec in (select RowID as Row_ID from IsUpdated) Loop
        update IsUpdated a
        set (code1, code2)=(
        select code1,code2
          from WillUpdate
         where RowID = (select distinct First_Value(RowID) over(order by dbms_random.value)
                          from WillUpdate))
        where a.RowID = rec.Row_ID;

    dbms_random.seed(to_number(to_char(systimestamp,('FF2')))+counter);
    counter := counter + 1;
    end Loop;
end;
/

--■■■確認用のSQL
select code1,code2,count(*)
  from IsUpdated
group by code1,code2
order by code1,code2;

select avg(code1),avg(code2)
  from IsUpdated;


解説

systimestampのミリ秒で、
乱数を初期化してます

DBMS_RANDOMの資料