6

以下のクエリでエラーが発生することはわかっています。SELECT DISTINCT が指定されている場合は、ORDER BY 項目を選択リストに含める必要があります。

SELECT DISTINCT city
FROM HR.Employees
WHERE country = N'USA' AND region = N'WA'
ORDER BY birthdate;

この理由は何ですか?実際に何が起こっているのですか?DISTINCT を使用しないか、生年月日を SELECT または ORDER BY city のみに追加すると、出力は得られますが、エラーにはなりません。それはSELECT DISTINCT city、都市のみを含む結果セットのみを提供し、他には何も提供しないためですか?

編集-(これは私の質問に対する答えかもしれません)

SELECT city
FROM HR.Employees
WHERE country = N'USA' AND region = N'WA'

上記のクエリを検討してください。確かではありませんが、これがどのように機能するかだと思います-舞台裏では、SQL Serverにはおそらくすべての列を含む結果セットがありますが、「表示セット」と呼ぶ都市列のみが表示されます。したがって、都市またはその他の列による順序付けは有効です。

代わりに SELECT DISTINCT city を使用すると、結果セットはどうなりますか? SQL サーバーの結果セットには、都市が DISTINCT の行だけが含まれているわけではありません。SELECT * クエリによって生成されたものと同様に、結果セット全体が含まれます。ただし、都市に基づいた個別の行のみが表示されます。この表示されたセットを生年月日に基づいて並べ替えることができますか? いいえ。

多くの従業員、つまり生年月日が多い都市では、SQL サーバーは、表示されたセットの順序付けにどの生年月日を使用する必要があるかを判断できません。そのため、エラー メッセージが表示されます。

4

2 に答える 2

25

を使用してクエリをSELECT DISTINCT書き換えることができますGROUP BY。したがって、クエリは次のとおりです。

SELECT DISTINCT city
FROM HR.Employees
WHERE country = N'USA' AND region = N'WA' ;

次と同等です。

SELECT city
FROM HR.Employees
WHERE country = N'USA' AND region = N'WA'
GROUP BY city ;

ここでも使えませんORDER BY birthdate。理由は両方のクエリで同じです。city同じであるが異なるを持つ多くの (複数の) 行が存在する場合がありますbirthdate。注文にはどれを使用する必要がありますか (許可されている場合)。

GROUP BYただし、クエリで集計関数を使用できます。

SELECT city
FROM HR.Employees
WHERE country = N'USA' AND region = N'WA'
GROUP BY city 
ORDER BY MIN(birthdate) ;               -- or MAX(birthdate)
于 2013-09-03T05:53:42.117 に答える
1
try this: 
select city 
    from (
    SELECT city, min(birthdate) as birthdate
    FROM HR.Employees
    WHERE country = N'USA' AND region = N'WA'
    group by city
          ) as t
    order by birthdate
于 2013-09-03T06:14:09.917 に答える