5

viewXいくつかのテーブルの結合に基づくビュー ( ) があります。

を使用するWHEREと、クエリが遅延し、プロセッサの使用率が 50% になり、最後にmysqld.exeサービスを閉じて再起動し、問題を再度解決する必要があります。

を使用するHAVINGと、クエリは完全かつ迅速に実行され、結果が得られ、すべての準備が整います。

クエリは次のようになります。

SELECT * FROM viewX WHERE column_of_view = 'foo'

SELECT * FROM viewX HAVING column_of_view = 'foo'

何が起こっている?

私が見つけた解決策は、次のようなことをすることです:

SELECT * FROM (SELECT * FROM viewX) as T WHERE column_of_view = 'foo'

SELECT * FROM (SELECT * FROM viewX) as T HAVING column_of_view = 'foo'

両方のクエリは正常に機能しますが、これは悪いと思います! (SELECT * FROM (...viewX)????)

4

4 に答える 4

5

WHERE条件に基づいてクエリ結果をフィルタリングするためのものです。

HAVING集計関数の結果にフィルターを適用するためのものです。集計関数がない場合は、WHERE と同じように機能します。

http://blog.sqlauthority.com/2007/07/04/sql-server-definition-comparison-and-difference-between-having-and-where-clause/

于 2011-09-16T03:41:21.403 に答える
1

having は sum、avg などの集計関数に使用され、select ステートメントでのみ使用できます。where 句は集計条件では機能しません。例: where sum(mark) > 300 // true ではありません

于 2016-02-19T10:32:58.580 に答える
0

リスト中にWHEREが使用されており、まだ ALIAS 名を使用できません

HAVINGは、考えられるすべての行をリストした後に行をフィルタリングするため、ALIAS 名が生成されます

行をインラインでフィルタリングする際に問題が発生するはずです。

于 2012-04-03T10:28:38.050 に答える
0

ビューの定義に依存します。having 句は集計クエリにのみ適用され、グループ化後に適用されます。2 つのクエリ プラン (説明付き) を確認しましたか?

于 2011-09-16T03:43:02.510 に答える