как использовать DISTINCT, когда у меня есть несколько столбцов в sql server

у меня есть следующий запрос:

select carBrand, carYear, carModel from cars;

Я хочу получить только разные названия автомобилей.

это я писал, но это не то, что я хочу.

select DISTINCT carBrand, carYear, carModel from Cars;

Как я могу решить эту проблему?

4 ответов


попробовать

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

DISTINCT работает на всей строке, а не на определенном столбце. Если вы хотите получить уникальные имена, выберите только этот столбец.

SELECT DISTINCT carBrand FROM Cars

Я не уверен, почему принятый ответ был принят и, конечно, не понимаю, почему он был повышен, но ОП имеет следующее в вопросе:

я написал это, но это не то, что я хочу.

select DISTINCT carBrand, carYear, carModel from Cars;

принятый ответ предложил использовать:

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

который возвращает тот же результат, что и запрос OP. На самом деле предложение в ответе (использовать group by) даже не рекомендуется использовать для получение отличных результатов, но должно использоваться для агрегации. См.этой ответа для получения дополнительной информации.

кроме того, SQL Server достаточно умен, чтобы понять, что если в запросе нет функции агрегации, то запрос фактически запрашивает distinct поэтому он будет использовать distinct под капотом.

Distinct будет делать distinct по всей строке, как указал @MarkByers в своем ответе.

для тех, кто хочет проверить, вот это скрипт, который создаст таблицу с 3 столбцами, а затем заполнит ее данными. Оба (distinct и group by) вернет тот же resultset.

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 etc.


Это зависит от того, что вы хотите. Например, если вы хотите "Toyota Corolla" и "Toyota Camry", но игнорируете год, тогда вы можете сделать это:

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