我很难解决SQL问题。我已经搜索过互联网,但未能找到解决方案。
我在下面提供了一些背景信息。我只包括了我认为相关的内容。
现有表:
Group
id - has index
Admin
id - has index
Post
id - has index
group_id - has index
admin_id - has index
我的问题:
在创建帖子时,软件中曾经存在一个未填充admin_id
列的错误。这没关系,因为到目前为止,假设每个组只有一个管理员。
我们现在正在添加为每个组设置多个管理员的功能,因此需要填充admin_id
。软件中的错误已得到修复,但我们必须返回并为每个帖子填充admin_id
。
我的解决方案/问题:
我做错了什么?以下是我的查询。它需要45分钟才能运行。我找不到解决这个问题的方法。如果它需要,我可以花45分钟,但是我真的很讨厌它,我很想找到一种有效的方法来用SQL做这件事。
UPDATE posts
SET admin_id = X.admin_id
FROM (
SELECT
posts.group_id,
admins_groups.admin_id
FROM posts
JOIN groups ON posts.group_id = groups.id
JOIN admins_groups ON groups.id = admins_groups.group_id
) AS X
WHERE posts.group_id = X.group_id;
到目前为止我尝试了什么。
除了搜索互联网并失败之外......我读到索引使写入速度变慢,所以我删除了posts.admin_id上的索引并且已经看到了20%的性能提升,但现在仍然足够好。
答案 0 :(得分:1)
据我所知,您不需要groups
表,也不应该在FROM
子句中重复更新的目标表:
UPDATE posts
SET admin_id = admins_groups.admin_id
FROM admin_groups
WHERE posts.group_id = admins_groups.group_id