2012-04-08 10 views
10

Mam następujące zapytanie:jak używać DISTINCT kiedy mam wielokrotne kolumny w serwerze sql

select carBrand, carYear, carModel from cars; 

co chcę dostać tylko różne nazwy samochodu.

Napisałem to, ale nie jest to, czego chcę.

select DISTINCT carBrand, carYear, carModel from Cars; 

Jak mogę rozwiązać ten problem?

+1

nazwa samochodu znajduje się w jakiej dziedzinie? – Randy

+0

W moim SqlSerwerze "wybierz DISTINCT carBrand, carYear, carModel from Cars;" działa idealnie – Gamby

Odpowiedz

18

spróbować

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

DISTINCT działa na cały wiersz, a nie na konkretną kolumnę. Jeśli chcesz uzyskać unikalne nazwy, wybierz tylko tę kolumnę.

SELECT DISTINCT carBrand FROM Cars 
3

To zależy co chcesz. Na przykład, jeśli chcesz „Toyota Corolla” i „Toyota Camry”, ale ignorują lat, to można to zrobić:

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

Nie próbuje się dziurkować lub być palantem, ponieważ SQL nie jest tym, z czym spędzam prawie tyle samo czasu, ale na pewno zawsze uważałem, że jest bardzo proste, aby TYLKO uzyskać "DISTINCT" w jednej kolumnie, jednak natknąłem się na to strona, ponieważ otrzymywałem tylko 20 rekordów z 'SELECT distinct id z tablename', a jeszcze 1000's records z' SELECT distinct id, pid from tablename' –

+0

'SELECT distinct id, pid z tabeli' == 'select distinct (id, pid) z tabeli ', że odrębne słowo kluczowe działa jako kombinacja wszystkich nazw kolumn. ma tajne nawiasy, które otulają wszystkie kolumny. może mylić ludzi –

3

Nie jestem pewien, dlaczego przyjął odpowiedź została przyjęta i na pewno nie rozumieją, dlaczego został on przegłosowany, ale OP zawiera następujące pytanie:

Napisałem to, ale nie jest to, czego chcę.

select DISTINCT carBrand, carYear, carModel from Cars; 

Przyjęte rozwiązanie jest zalecane, aby użyć:

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

która zwraca dokładnie taki sam wynik jak zapytania OP. W rzeczywistości sugestia zawarta w odpowiedzi (grupa użycia) nie jest nawet zachęcana do uzyskiwania wyraźnych wyników, ale powinna być użyta do agregacji. Aby uzyskać więcej informacji, zobacz odpowiedź this.

Ponadto SQL Server jest na tyle sprytny, aby zrozumieć, że jeśli w zapytaniu nie ma funkcji agregacji, zapytanie prosi się o distinct, więc pod maską będzie używane distinct.

Distinct będzie wyróżniał się na całym wierszu, jak zaznaczył @MarkByers w swojej odpowiedzi.

Dla tych, którzy chcą przetestować powyższe, oto skrypt, który utworzy tabelę z 3 kolumnami, a następnie wypełni ją danymi. Zarówno (distinct i group by) zwrócą ten sam zestaw wyników.

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'); 

Oba zapytania powróci ten wynik:

carBrand carYear carModel 
BMW   2000  328 i 
BMW   2000  3M 

Wnioski

NIE używaj group by jeśli chcesz odrębne rejestry. Użyj distinct. Użyj funkcji group by podczas korzystania z funkcji agregacji, takiej jak SUM, COUNT itd.

Powiązane problemy