2016-07-11 7 views
0

私はテーブル(t1)を持っています。私はランダムにセットの割合を取得する方法を知っています。pl/sqlクエリでランダムに行を取得する

ランダムに選択した行の30%をt2に挿入し、残りの70%をテーブルt3に挿入します。

t1t2を比較し、t3に挿入テーブルt2へと比べて30%を挿入する以外の任意の他の方法はありますか?テーブルが巨大なので、このメソッドは私にとっては良くありません。

ps。オラクル版 - 11g

+1

ニックピッキングには申し訳ありませんが、PL/SQLクエリなどはありません。 PL/SQLは手続き型言語です。あなたのクエリはたぶんSQLです。 btwというクエリを表示しても怪我をすることはありません。 – sstan

+0

「巨大」の巨大さはどれくらいですか?行数(桁数)? – mathguy

+0

約350万件 –

答えて

3

ora_hashを参照してください。 9のバケツでテーブルのPK(または同様の列の組み合わせ)を使用してハッシュを生成し、0-6を持つテーブルを1つのテーブルに入れ、7,8,9を持つテーブルを別のテーブルに入れます。

2

はすべて挿入しますか?ここで私は人事部の従業員テーブルを使っていましたので、私はランダムに注文し、その30%を取った。それらのものは1のインジケータを持っています。私はテーブル全体でユニオンを行い、0のインジケータを与えました。インジケータの最大値をとり、インサートをすべて行いました。指標が第1の表に1である場合、残りの70%は第2の表に入る。

INSERT ALL 
    WHEN (table_one_ind = 1) THEN 
INTO table_one 
    (
    employee_id, 
    first_name, 
    last_name, 
    email, 
    hire_date, 
    job_id 
) 
    VALUES 
    (
    employee_id, 
    first_name, 
    last_name, 
    email, 
    hire_date, 
    job_id 
) 
    ELSE 
INTO table_two 
    (
    employee_id, 
    first_name, 
    last_name, 
    email, 
    hire_date, 
    job_id 
) 
    VALUES 
    (
    employee_id, 
    first_name, 
    last_name, 
    email, 
    hire_date, 
    job_id 
) 
SELECT MAX (table_one_ind) table_one_ind, 
    employee_id, 
    first_name, 
    last_name, 
    email, 
    hire_date, 
    job_id 
FROM 
    (SELECT t.*, 
    1 AS table_one_ind 
    FROM 
    (SELECT * FROM employees ORDER BY dbms_random.value 
    ) t 
    WHERE rownum <= 
    (SELECT ceil(COUNT(*)*.3) FROM employees 
    ) 
    UNION ALL 
    SELECT t.*, 0 FROM employees t 
) 
GROUP BY employee_id, 
    first_name, 
    last_name, 
    email, 
    hire_date, 
    job_id 
関連する問題