2017-04-15 5 views
0

category_idnameのカラムを持つテーブルcategoriesがあります。私はランダムなデータで新しいテーブルproductsを生成したいと思います。テーブルproductsには、カラムproduct_id, category_id, name, priceがあります。私は各製品ランダムcategory_idに与えたいと思う。このスクリプトは、製品の100行を生成新しいテーブルを生成するときにテーブルからランダムな行を取得

INSERT INTO products (category_id, name, price) 
SELECT 
    (SELECT category_id FROM categories OFFSET floor(random()*50) LIMIT 1), 
    ('Product ' || i), 
    round(cast(random() * 999 + 1 as numeric), 2) 
FROM generate_series(1,100) as seq(i) 

が、それぞれの製品が同じcategory_idがあります

はテーブルproductsのためのスクリプトを生成マイ。私が間違っていることは何ですか?

答えて

1

"問題"は、Postgresが最適化に関してあまりにも積極的であるということです。サブクエリが一度だけ呼び出される可能性があることを認識できます。random()が確定的な関数ではないという事実を無視しています。

この問題を解決する一つの方法は、相関サブクエリを含む:

SELECT (SELECT category_id 
     FROM categories c 
     WHERE c.category_id <> seq.i 
     OFFSET floor(random()*3) 
     LIMIT 1 
     ), 
     ('Product ' || i), 
     round(cast(random() * 999 + 1 as numeric), 2) 
FROM generate_series(1,100) as seq(i); 
関連する問題