生成新表时从表中获取随机行

时间:2017-04-15 10:57:59

标签: sql postgresql generate-scripts

我的表categories包含category_id列和name列。我想用随机数据生成新表products。表格products包含product_id, category_id, name, price列。我想随机给每个产品category_id

表格products的生成脚本:

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)

此脚本生成100行产品,但每个产品都具有相同的category_id。我做错了什么?

1 个答案:

答案 0 :(得分: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);