1

私は次のSQLクエリを試しています:

  select (execution_end_timestamp - execution_queued_timestamp) as totalTime, execution_queued_timestamp from exec_queue
  where execution_name like '%Generate%'
  and execution_queued_timestamp > '2012-10-04 20:00:00.000'
  having totalTime < '1900-01-01 00:00:06.000'

where句とhave句でtotalTimeを使用してみましたが、どちらの場合も機能しません。それがうまくいくことを期待してdatediffも試しましたが、同じ結果が得られました。

whereまたはhave句で計算フィールドを使用できるトリックはありますか?集計機能を使用している場合を除いて、グーグルで何も表示されませんでした。

4

2 に答える 2

4

いいえ、エイリアスはWHERE句で許可されていません、try、

select (execution_end_timestamp - execution_queued_timestamp) as totalTime, execution_queued_timestamp 
from exec_queue
where execution_name like '%Generate%' AND
      execution_queued_timestamp > '2012-10-04 20:00:00.000' AND
      (execution_end_timestamp - execution_queued_timestamp) < '1900-01-01 00:00:06.000'

と句ALIASが機能しない理由、WHEREHAVING

  • 最初に、内のすべてのテーブルの積from clauseが形成されます。
  • 次にwhere clause、が評価され、search_conditionを満たさない行が削除されます。
  • 次に、の列を使用して行がグループ化されますgroup by clause
  • having claus次に、 eのsearch_conditionを満たさないグループが削除されます。
  • 次に、select clauseターゲットリスト内の式が評価されます。
  • select句にが存在する場合distinct keyword、重複する行が削除されるようになりました。
  • union副選択が評価された後に取得されます。
  • 最後に、結果の行は、で指定された列に従ってソートされますorder by clause
于 2012-10-05T02:01:44.460 に答える
3

以前はSQL-92、99、および2003 ISO標準へのリンクがありましたが、このリンクは今のところ機能します。

基本的に、クエリ実行のシーケンスは次のとおりです。

1. FROM/JOIN
2. WHERE/ON   -- exception for LEFT JOIN
3. GROUP BY (incl. CUBE, ROLLUP, GROUPING SETS)
4. HAVING
5. SELECT
6. DISTINCT
7. ORDER BY

したがって、SELECT列用に作成したエイリアスは、WHEREフェーズとHAVINGフェーズには表示されません。これは、実際には式をコピーして貼り付けるだけで、非常に簡単です。エッジケースは、長くて複雑な数式を処理している場合である可能性があります。これは、サブクエリを実行した方がよい場合があります。

select totalTime,
       execution_queued_timestamp
from (
    select (execution_end_timestamp - execution_queued_timestamp) as totalTime,
           execution_queued_timestamp
    from exec_queue
    where execution_name like '%Generate%'
      and execution_queued_timestamp > '2012-10-04 20:00:00.000'
) x
where totalTime < '1900-01-01 00:00:06.000'

ヒントをあげましょう。SQL Serverは、WHEREフィルターを内部クエリに取り込んで、それをベーステーブルに適用することを実際に認識しているため、パフォーマンスが低下することはありません

于 2012-10-05T02:08:19.140 に答える