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

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

select carBrand, carYear, carModel from cars;

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

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

select DISTINCT carBrand, carYear, carModel from Cars;

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

Ответ 1

попробовать

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

Ответ 2

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

SELECT DISTINCT carBrand FROM Cars

Ответ 3

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

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

Ответ 4

Я не уверен, почему принятый ответ был принят и, разумеется, не понял, почему он был поддержан, но у 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 в его ответе, отличительная особенность будет отличаться от всей строки.

Для тех, кто хочет проверить выше, вот script, который создаст таблицу с тремя столбцами, а затем заполнит ее данными. Оба (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 и т.д.