2016-08-27 10 views
4

ランダムに1つのテーブルから値を選択する必要があります。 tableA.a_idVARCHAR2であり、この値を使用して別のテーブルに挿入します。むしろからランダムに行を選ぶよりも、しかしOracleのランダムな行を選択

insert into tableX 
select 
    rownum, 
    dbms_random.value(100,999), 0), 
    (select a_id from 
    (
     SELECT a_id 
     FROM tableA 
     ORDER BY dbms_random.value 
    ) 
    where rownum = 1) 
from 
    (select level from dual connect by level <= 100); 

:例えば、3つの列を想定するtableXの100行(配列番号100および999、およびtableA.a_idの値の間の乱数)に挿入する必要があります私は繰り返しサブクエリを実行した場合、私は、例えば(明白な理由ため)新しい値を毎回取得する、しかし

1 129 A-ID-48 
2 849 A-ID-48 
3 367 A-ID-48 

:各行についてtableA.a_idは、それは例えば、すべての行に対して同じ値を選択します。

select a_id from 
    (
     SELECT a_id 
     FROM tableA 
     ORDER BY dbms_random.value 
    ) 
where rownum = 1; 

結果は、各実行後に次のようになります。

A-ID-7 
A-ID-48 
A-ID-74 
私はそれがtableA年代a_id列からランダムに行を挿入するだろう、元のクエリを変更する、またはそのことについては新しいものを考え出すにはどうすればよい

各挿入行の宛先テーブルに?欲望の結果:

1 129 A-ID-7 
2 849 A-ID-48 
3 367 A-ID-74 

mathguy answerに基づいて更新1

、私は、単一のテーブル選択のためのクエリを更新:

insert into tableX 
select 
    rownum, 
    round(dbms_random.value(100,999), 0), 
    a_id 
from 
    (
     select 
     round(dbms_random.value(1, (select count(*) from tableA)), 0) tableX_rand_num 
     from tableX 
    ) x 
join 
    (
     select 
     a_id, 
     dbms_random.value() rnd, 
     rownum tableA_rownum 
     from tableA 
     order by rnd 
    ) a 
on x.tableX_rand_num = a.tableA_rownum 
where rownum <= 100; 

制限:これを使用して挿入された行の数をメソッドは、親テーブル(tableX)で利用可能な番号レコードとは独立していません。換言すれば、利用可能な合計行数はtableXのレコード数だけ挿入できます。例えばtableXにレコードが200あり、1000を挿入する場合は、上記のクエリで最大200行まで挿入できます。

答えて

5

内側のクエリを作成します。

select a_id, dbms_random.value() rnd from tableA order by rnd 

、その後、外側のクエリでワンショットで100行を選択し、rownum <= 100で。

ので、同じように:

insert into tableX 
select 
    rownum, 
    round(dbms_random.value(100,999), 0), 
    a_id 
from 
    (
     SELECT a_id, dbms_random.value() rnd 
     FROM tableA 
     ORDER BY rnd 
    ) 
where rownum <= 100; 
+0

私は非常にあなたのロジックを以下のいませんよ。どのインナークエリーを交換する必要がありますか? 1つのレコードだけを返すために、最初の内部クエリに 'rownum = 1'が必要なのですか? – NuCradle

+0

完全なクエリを回答に追加する方が簡単でした。上記をご覧ください。 – mathguy

+0

変更があったとは思わない: – NuCradle

関連する問題