как использовать DISTINCT, когда у меня есть несколько столбцов в sql server
у меня есть следующий запрос:
select carBrand, carYear, carModel from cars;
Я хочу получить только разные названия автомобилей.
это я писал, но это не то, что я хочу.
select DISTINCT carBrand, carYear, carModel from Cars;
Как я могу решить эту проблему?
4 ответов
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;