假设我有以下架构:
A ID,数字
B id,数字
ID id
并有一个查询返回我想要的内容,如下所示:
SELECT ids.id, Atotal.total, Btotal.total
FROM ids
LEFT JOIN (
SELECT id, SUM(number) as total
FROM A
GROUP BY id
) Atotal
ON Atotal.id = ids.id
LEFT JOIN (
SELECT id, SUM(number) as total
FROM B
GROUP BY id
) Btotal
ON Btotal.id = ids.id
即,我们会在 ids 中为每个ID返回A和B中每个ID的总和。
我知道这非常低效,但我的替代方案是什么,为什么/如何更有效率呢?
我觉得我可以在这里使用IN,但我不想继续使用它而不知道为什么它会更好,以及在多大程度上。我做了一些谷歌搜索,但找不到类似我的问题。
(另外,如果有任何好的材料可以帮助我提高SQL的效率,我们将非常感激!)
答案 0 :(得分:0)
您的查询应该没问题。您可以将性能与子查询方法进行比较:
select i.id,
(select sum(a.number) from A where a.id = i.id) as ATotal,
(select sum(b.number) from B where b.id = i.id) as BTotal
from ids i;
特别感兴趣的是当A(id, number)
和B(id, number)
上有索引时会发生什么。我不确定在Postgres中这是否更好,但在某些情况下,相关子查询在某些数据库中的表现更好。