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

Posted

技术标签:

【中文标题】生成新表时从表中获取随机行【英文标题】:Get random row from table when generating new table 【发布时间】:2017-04-15 10:57:59 【问题描述】:

我有一个表categories,列有category_idname。我想用随机数据生成新表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】:

“问题”是 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);

【讨论】:

以上是关于生成新表时从表中获取随机行的主要内容,如果未能解决你的问题,请参考以下文章

通过 SQLAlchemy 获取随机行

从mysql中的大表中快速选择随机行

从 SQL Server 表中选择 n 个随机行

从 sqlite 表中选择随机行

如何从 SQL 数据库表中选择随机行? [复制]

将一个表中的单行连接到另一个表中的 n 个随机行