9

私はこれができるようになりたいです:

SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
FROM dept 
     INNER JOIN invoices ON invoices.id_dept = dept.id 
WHERE sumTotal > 10000

しかし、「sumTotal」の使用について不明な列が表示されます。

これは可能ですか?

4

4 に答える 4

19

使用HAVING

SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
FROM dept 
INNER JOIN invoices
    ON invoices.id_dept = dept.id 
HAVING sumTotal > 10000

問題は、WHERE句がステートメントの前に実行されることです。SELECTしたがって、このsumTotal列はまだ利用できません。

HAVING句はステートメントの後に実行されます。SELECTすべてを選択した後、結果をフィルタリングします。ただし、使用HAVINGが遅いため、注意してください。行のセット全体で動作します。

MySQLドキュメントから:

HAVING句は、アイテムがクライアントに送信される直前のほぼ最後に適用され、最適化は行われません。(制限はHAVINGの後に適用されます。)

SQL標準では、HAVINGはGROUPBY句の列または集計関数で使用される列のみを参照する必要があります。ただし、MySQLはこの動作の拡張をサポートしており、HAVINGがSELECTリストの列と外部サブクエリの列も参照できるようにします。


HAVING句は集計関数を参照できますが、WHERE句では参照できません。

SELECT user, MAX(salary)
FROM users
GROUP BY user
HAVING MAX(salary) > 10;

WHERE句に含める必要のある項目にはHAVINGを使用しないでください。

于 2013-03-25T15:38:57.050 に答える
5

または、WHEREを使用します...

SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
  FROM dept 
  JOIN invoices ON invoices.id_dept = dept.id 
 WHERE invoices.col1 + invoices.col2 + invoices.col3 > 10000
于 2013-03-25T15:46:49.927 に答える
4

これを試すこともできます:

WITH temp AS
(
 SELECT
   dept.id,
   (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
 FROM dept INNER JOIN invoices ON invoices.id_dept = dept.id
)
SELECT *
FROM temp
WHERE sumTotal > 10000
于 2013-03-25T15:44:41.717 に答える
1

'having'を使用する必要があります-

SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
FROM dept 
INNER JOIN invoices ON invoices.id_dept = dept.id 
HAVING sumTotal > 10000

エイリアスフィールドを使用できるかどうか、または'having(invoices.col1 + invoices.col2 + invoices.col3)>10000と書く必要があるかどうかはわかりません。

'where'ステートメントは'select'と連動して機能します。これは、最初に返されるレコードをフィルタリングします。次に、「Having」は、データセットを返すデータセットをフィルタリングします。これは通常、「select」の時点で「having」条件を認識できなかったためです。

1つのドキュメントを引用すると、「WHEREキーワードを集計関数で使用できなかったため、HAVING句がSQLに追加されました。」他の場所に記述されている' SQLHAVING句はSQLGROUPBY句と組み合わせて使用​​されます。SQL SELECTステートメントで使用して、SQLGROUPBYが返すレコードをフィルタリングできます

于 2013-03-25T15:44:56.690 に答える