web-dev-qa-db-ja.com

SQL Serverに複数の列がある場合のDISTINCTの使用方法

次のクエリがあります。

select carBrand, carYear, carModel from cars;

私が欲しいのは、異なる車名だけを取得することです。

これを書いたのですが、私が欲しいものではありません。

select DISTINCT carBrand, carYear, carModel from Cars;

この問題を解決するにはどうすればよいですか?

10
EmreAltun

試す

SELECT carBrand , carYear ,carModel 
FROM Cars 
GROUP BY carBrand , carYear ,carModel;
17
Yahia

DISTINCTは特定の列ではなく行全体で機能します。一意の名前を取得する場合は、その列のみを選択してください。

SELECT DISTINCT carBrand FROM Cars
17
Mark Byers

なぜ承認された回答が承認されたのかはわかりませんが、なぜそれが賛成されたのかはわかりませんが、OPは質問に次のように答えています。

私はこれを書いたが、それは私が望むものではない。

select DISTINCT carBrand, carYear, carModel from Cars;

受け入れられた答えは使用することを提案しました:

SELECT carBrand , carYear ,carModel 
FROM Cars 
GROUP BY carBrand , carYear ,carModel;

これは、OPのクエリとまったく同じ結果を返します。実際、回答(use group by)の提案は、明確な結果を得るために使用することは推奨されていませんが、集計に使用する必要があります。詳細は this answerを参照してください。

さらに、SQL Serverは、クエリに集計関数がない場合、クエリが実際にdistinctを要求するので、内部でdistinctを使用することを理解するのに十分スマートです。

@MarkByersが彼の答えで示したように、Distinctは行全体で個別に処理を行います。

上記をテストしたい人のために、3つの列を持つテーブルを作成し、それをデータで埋めるスクリプトを次に示します。両方(distinctgroup by)は同じ結果セットを返します。

CREATE TABLE [dbo].[Cars](
    [carBrand] [varchar](50) NULL,
    [carYear] [int] NULL,
    [carModel] [varchar](50) NULL
)
go;
insert into Cars values('BMW', 2000, '328 i');
insert into Cars values('BMW', 2000, '328 i');
insert into Cars values('BMW', 2000, '328 i');
insert into Cars values('BMW', 2000, '3M');

どちらのクエリでも次の結果が返されます。

carBrand    carYear    carModel
BMW         2000       328 i
BMW         2000       3M

結論

使ってはいけません group by別個のレコードが必要な場合。 distinctを使用します。使用する group bySUMCOUNTなどの集計関数を使用する場合.

8
CodingYoshi

それはあなたが望むものに依存します。たとえば、「トヨタカローラ」と「トヨタカムリ」が必要だが、年は無視する場合は、次のようにします。

SELECT DISTINCT carBrand + ' ' + carModel AS carName
FROM Cars;
3
McGarnagle