10

次のクエリがあります。

select carBrand, carYear, carModel from cars;

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

私はこれを書きましたが、それは私が望むものではありません。

select DISTINCT carBrand, carYear, carModel from Cars;

どうすればこの問題を解決できますか?

4

4 に答える 4

17

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

SELECT DISTINCT carBrand FROM Cars
于 2012-04-08T20:23:46.170 に答える
17

試す

SELECT carBrand , carYear ,carModel 
FROM Cars 
GROUP BY carBrand , carYear ,carModel;
于 2012-04-08T20:23:53.220 に答える
10

受け入れられた回答が受け入れられた理由はわかりませんし、なぜ賛成されたのかは確かにわかりませんが、OPの質問には次のように記載されています。

私はこれを書きましたが、それは私が望むものではありません。

select DISTINCT carBrand, carYear, carModel from Cars;

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

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

OPのクエリとまったく同じ結果を返します。実際、回答の提案 (グループ化を使用) は、個別の結果を取得するために使用することさえ推奨されていませんが、集計には使用する必要があります。詳細については、この回答を参照してください。

さらに、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 by場合に使用します。SUMCOUNT

于 2017-06-09T22:17:05.663 に答える
3

それはあなたが望むものに依存します。たとえば、'Toyota Corolla' と 'Toyota Camry' が必要で、年を無視する場合は、次のようにします。

SELECT DISTINCT carBrand + ' ' + carModel AS carName
FROM Cars;
于 2012-04-08T20:24:26.450 に答える