3

2 つのクエリの結果が同じなのはなぜですか? ( Northwind データベースを使用しています。 )

SELECT      ContactTitle
        ,   COUNT(CustomerID) AS NumberOfCustomer
FROM        dbo.Customers
WHERE       ContactTitle LIKE '%sales%'
GROUP BY    ContactTitle
HAVING      COUNT(*) >= 5
ORDER BY    NumberOfCustomer desc

SELECT 
DISTINCT    ContactTitle
        ,   COUNT(CustomerID) AS NumberOfCustomer
FROM        dbo.Customers
WHERE       ContactTitle LIKE '%sales%'
GROUP BY    ContactTitle
HAVING      COUNT(*) >= 5
ORDER BY    NumberOfCustomer desc

結果は次のとおりです。

ContactTitle           NumberOfCustomer
---------------------  ----------------
Sales Representative         17
Sales Manager                11
Sales Associate               7
Sales Agent                   5

私自身の理解では、2 番目のクエリは個別のタイトルを取得し、そのレコードをカウントするため、各タイトルのレコード数は 1 しかないため、結果はゼロになると予想しています。よろしいですか?

4

4 に答える 4

7

DISTINCT他の操作の後に行われます。最初に、すでに各行を区別する GROUP BY を実行するため、DISTINCT冗長です。

于 2012-05-02T14:33:31.967 に答える
3

個別は、タイトルカウントに適用されます。選択の計算が完了すると、それから個別のリストが作成されます。

于 2012-05-02T14:33:59.090 に答える
3

DISTINCT結果セットから重複レコードをフィルタリングします。この場合、重複するレコードがないため、DISTINCTは効果がありません。

于 2012-05-02T14:34:04.570 に答える
3

これがクエリ実行のしくみです。2 番目のステートメントでは、同じ列名を含むことで既にその操作が実行されているDISTINCTため、追加の機能は実行されません。GROUP BYContactTitle

1. FROM
2. WHERE
3. GROUP BY <-- You have specified the column `ContactTitle`, 
-- which means the results would be grouped by that column to product unique 
--result.
4. HAVING
5. SELECT <-- Adding DISTINCT on ContactTitle column here doesn't make much 
-- difference and it is actually redundant. DISTINCT is applied to the whole
-- row but the resultset already contains distinct rows grouped by the column 
-- `ContactTitle`.
6. ORDER BY
于 2012-05-02T14:38:46.530 に答える