如何从 PostgreSQL 中的另一个表中更新具有随机 id 的表

Posted

技术标签:

【中文标题】如何从 PostgreSQL 中的另一个表中更新具有随机 id 的表【英文标题】:How can I update a table with random ids from another table in PostgreSQL 【发布时间】:2021-04-23 11:38:59 【问题描述】:

我有一个包含一百万条记录的成员表。主键是 id。此表中的一列是 master_location_id,它指的是 master_location 表中的 id 列,它有 41481 条记录。成员表中的 master_location_id 尚未填充。我正在使用匿名块填充它。它将从成员表中获取所有记录,然后循环,从 master_location 获取随机记录(从 master_location order by random() limit 1 中选择 id),然后更新成员表。但它的效率非常低。是否可以使用 SQL 语句执行此操作? PostgreSQL 版本是 13.2。

【问题讨论】:

***.com/questions/8674718/… 【参考方案1】:

您可以使用row_number()。假设主位置比成员多,您可以使用:

update members m
    set master_location_id = ml.id
    from (select m.*, row_number() over (order by id) as seqnum
          from members m
         ) mm join
         (select ml.*, row_number() over (order by random()) as seqnum
          from master_locations ml
         ) ml
         on ml.seqnum = mm.seqnum
    where mm.id = m.id;

请注意,更新一百万行需要一些时间。

此外,如果位置数少于成员数,则可以轻松调整这一点——对JOIN 条件使用模运算。这将是对查询的调整。

编辑:

分配多个位置的调整是:

update members m
    set master_location_id = ml.id
    from (select m.*, row_number() over (order by id) as seqnum
          from members m
         ) mm join
         (select ml.*,
                 row_number() over (order by random()) as seqnum,
                 count(*) over () as cnt
          from master_locations ml
         ) ml
         on ml.seqnum = mm.seqnum % ml.cnt
    where mm.id = m.id;

【讨论】:

有 100 万会员,41481 个地点(美国邮政编码) 我猜设置 m.master_location_id = ml.id 应该设置 master_location_id = ml.id @Jayadevan 。 . .我修好了。

以上是关于如何从 PostgreSQL 中的另一个表中更新具有随机 id 的表的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据库表中获取数据并将该数据更新到休眠中的另一个表中?我已经在 J​​SP 中完成了,但我想在 Hibernate 中完成

SQL 从另一个表中的另一列更新一列

如何使用另一个表中的另一列更新一列? SQL 错误:ORA-00933:SQL 命令未正确结束

如何从 SQL 中的另一个表中获取计数?

如何从oracle中的另一个表中填充空列?

如果插入语句给出重复键异常(在表中找到行 id=1)如何更新 JDBC(Postgresql)中的语句