生成新的 table 时从 table 获取随机行
Get random row from table when generating new table
我有 table categories
列 category_id
和 name
。我想用随机数据生成新的 table products
。 Table products
有列 product_id, category_id, name, price
。我想给每个产品随机 category_id
.
我为 table 生成的脚本 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
。我做错了什么?
"problem"是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);
我有 table categories
列 category_id
和 name
。我想用随机数据生成新的 table products
。 Table products
有列 product_id, category_id, name, price
。我想给每个产品随机 category_id
.
我为 table 生成的脚本 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
。我做错了什么?
"problem"是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);