次のクエリがあります。
select carBrand, carYear, carModel from cars;
私が欲しいのは、異なる車名だけを取得することです。
これを書いたのですが、私が欲しいものではありません。
select DISTINCT carBrand, carYear, carModel from Cars;
この問題を解決するにはどうすればよいですか?
試す
SELECT carBrand , carYear ,carModel
FROM Cars
GROUP BY carBrand , carYear ,carModel;
DISTINCTは特定の列ではなく行全体で機能します。一意の名前を取得する場合は、その列のみを選択してください。
SELECT DISTINCT carBrand FROM Cars
なぜ承認された回答が承認されたのかはわかりませんが、なぜそれが賛成されたのかはわかりませんが、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つの列を持つテーブルを作成し、それをデータで埋めるスクリプトを次に示します。両方(distinct
とgroup 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 by
SUM
、COUNT
などの集計関数を使用する場合.
それはあなたが望むものに依存します。たとえば、「トヨタカローラ」と「トヨタカムリ」が必要だが、年は無視する場合は、次のようにします。
SELECT DISTINCT carBrand + ' ' + carModel AS carName
FROM Cars;