53

私のコードは以下のようなものです:

select col1,count(col2) as col7
from --some join operation
group by col1
having col7 >= 3 -- replace col7 by count(col2) to make the code work

私のコードでは、「列名 'col7' が無効です」というエラーが発生します。なぜこれが起こるのですか?SQL が最後の行で col7 を使用することを許可していないのは非論理的です。

SQL Server Express 2008 を使用しています

4

8 に答える 8

57

HAVING句は - の前に評価されるためSELECT、サーバーはそのエイリアスについてまだ認識していません。

  1. まず、FROM節内のすべてのテーブルの積が形成されます。

  2. その後、WHERE句が評価され、search_condition を満たさない行が削除されます。

  3. 次に、GROUP BY句の列を使用して行がグループ化されます。

  4. search_condition次に、HAVING句の を満たさないグループが除外されます。

  5. 次に、SELECTステートメント ターゲット リスト内の式が評価されます。

  6. DISTINCTselect 句にキーワードが存在する場合、重複する行が削除されるようになりました。

  7. UNION、各副選択が評価された後に取得されます。

  8. ORDER BY最後に、結果の行は句で指定された列に従ってソートされます。

  9. TOP句が実行されます。

これがあなたの質問に答えることを願っています。また、エイリアスがORDER BY句で機能する理由についても説明します。

于 2016-08-16T15:21:02.347 に答える
34

MS SQLでは、エイリアスを参照できる(私が知っている)唯一の場所はORDERBY句です。クエリの他の部分でエイリアスを参照する機能は、他の多くのdbプラットフォームにある機能であり、正直なところ、Microsoftがそれを追加するのに十分な機能とは見なしていないことに悩まされています。

于 2012-12-27T04:56:29.153 に答える
7

選択リストには、having 句でも使用できる同じ式が含まれているため、これを試してください。

SELECT COL1,COUNT(COL2) AS COL7
FROM --SOME JOIN OPERATION
GROUP BY COL1
HAVING COUNT(COL2) >= 3 
于 2012-12-27T04:43:27.203 に答える
6

count() 列を使用するには、2 回選択する必要があります

select * from (select col1,count(col2) as col7
from --some join operation
group by col1) as temp
where temp.col7 >= 3
于 2012-12-27T02:29:45.327 に答える
0

col1,count(col2) を col7 から --some join 操作グループを、count(col2) >= 3 を持つ col1 で選択します。

正直なところ、SQL Server が列のエイリアスを処理しない理由について、私は不満を感じています。これを回避策として使用します。列名は引き続きエイリアスとして出力されますが、元の集計関数を使用して処理されます。

于 2016-07-23T19:29:53.000 に答える