小编jph*_*jph的帖子

避免冗余聚合函数和/或按列分组的最佳方法

假设我有两个表:

福:

id
baz
Run Code Online (Sandbox Code Playgroud)

酒吧:

id
foo_id
boom
Run Code Online (Sandbox Code Playgroud)

所以一个 Foo 有很多 Bars。我经常发现自己需要为给定的一组 Foo 计算跨条的聚合,但我也想要一些来自 Foo 的属性。这样做的两种最直接的方法是丑陋的:

方法#1:不必要的聚合函数

select
  foo.id,
  min(foo.baz) as baz,
  min(bar.boom) as min_boom
from
  foo
join
  bar on foo.id = bar.foo_id
group by
  foo.id;
Run Code Online (Sandbox Code Playgroud)

方法#2:不必要的按列分组

select
  foo.id,
  foo.baz,
  min(bar.boom) as min_boom
from
  foo
join
  bar on foo.id = bar.foo_id
group by
  foo.id,
  foo.baz;
Run Code Online (Sandbox Code Playgroud)

当 Foo 除了“id”之外只有一个额外的列时,这并不是那么糟糕,但是如果需要包含许多列,那么分组的效率就会大大降低。像这样的查询解决了这两个问题,但似乎很笨拙:

select
  foo.id,
  foo.baz,
  x.min_boom
from
  foo
join
  (select
    foo_id, 
    min(boom) as min_boom
  from
    bar
  group by
    foo_id) x on x.foo_id = foo.id; …
Run Code Online (Sandbox Code Playgroud)

postgresql performance subquery postgresql-9.3 query-performance

7
推荐指数
1
解决办法
6749
查看次数