HAVING
は特に凝集列のために設計されています。 MySQLでは、HAVING
句の集約されていない列が許可されます。 3ユースケースは、私は考えることができること、あります
- 効率ハック、グループの値がグループのために、同一の値を持ちます。
- エラーは避けてください。
- アグリゲーションがない場合の効率的なハック。
最初はおそらくこのような状況で使用することができる。すべてのl.foo
が与えられたl.listid
に同じ値を持つ必要があるため
select l.*, sum(x.y)
from list l join
. . .
group by l.listid
having l.foo = 'bar';
これは動作します(l.listid
を仮定すると、主キーです)。この場合、これはあたかもwhere
を使用したかのようにデータをフィルタリングします。
しかし、この条件が真でない場合、HAVING
/WHERE
の等価は真ではありません。 HAVING
は不確定行から値を選択し、結果の集約列をフィルタリングします。 WHERE
は、集約前にフィルタリングを行います。リストは同じ型を持つことができ、あなたが行うのであれば、:
select l.*, sum(x.y)
from list l join
. . .
group by l.type
having l.foo = 'bar';
これはひどく形成されたクエリ(私の意見では、したがってエラー)ですが、WHERE
に条件を移動すると等価ではありません。
select l.*, concat('a', 'b', 'c') as test
from list l
having test = 'abc';
これは、MySQLでの利便性がある:何の集約がない場合
第3の状況です。他の方言はサブクエリを使用します。MySQLはサブクエリを実現し、非効率性をもたらします。
「集約されていないグループ化された列」とはどういう意味ですか?例? –
私はいくつかの条件の評価を遅らせるためにオプティマイザを騙すために(SQL Server上で)使用しようとしました。私は詳細を覚えていない。私は実行計画の違いを見ても、私が期待した結果は得られていないと思います。 – shawnt00
@ExplosionPills OPは、select節に集約されていない列があり、それをグループ化し、節を持つことに条件を含めることを意味します(私は考える)。 @KamilG。 –