uis*_*sky 1 sql count aggregate-functions sql-update
我在表"user"中有2个整数字段:leg_count和leg_length.第一个存储用户的腿数,第二个存储它们的总长度.
属于用户的每条腿存储在单独的表中,只要典型的互联网用户可以有零到无限的腿:
CREATE TABLE legs (
user_id int not null,
length int not null
);
Run Code Online (Sandbox Code Playgroud)
我想在一个查询中重新计算所有用户的统计信息,所以我尝试:
UPDATE users SET
leg_count = subquery.count, leg_length = subquery.length
FROM (
SELECT COUNT(*) as count, SUM(length) as length FROM legs WHERE legs.user_id = users.id
) AS subquery;
Run Code Online (Sandbox Code Playgroud)
并获取"FROM中的子查询不能引用相同查询级别的其他关系"错误.
所以我必须这样做
UPDATE users SET
leg_count = (SELECT COUNT(*) FROM legs WHERE legs.user_id = users.id),
leg_length = (SELECT SUM(length) FROM legs WHERE legs.user_id = users.id)
Run Code Online (Sandbox Code Playgroud)
是什么让数据库为每一行执行2个SELECT,但是,所需的数据可以在一个SELECT中计算:
SELECT COUNT(*), SUM(length) FROM legs;
Run Code Online (Sandbox Code Playgroud)
是否可以优化我的UPDATE查询以仅使用一个SELECT子查询?
我使用PostgreSQL,但我相信,任何SQL方言都存在解决方案.
TIA.
我会做:
WITH stats AS
( SELECT COUNT(*) AS cnt
, SUM(length) AS totlength
, user_id
FROM legs
GROUP BY user_id
)
UPDATE users
SET leg_count = cnt, leg_length = totlength
FROM stats
WHERE stats.user_id = users.id
Run Code Online (Sandbox Code Playgroud)