web-dev-qa-db-fra.com

comment utiliser DISTINCT lorsque j'ai plusieurs colonnes sur le serveur SQL

J'ai la requête suivante:

select carBrand, carYear, carModel from cars;

ce que je veux, c'est obtenir uniquement des noms de voiture différents.

J'ai écrit ça, mais ce n'est pas ce que je veux.

select DISTINCT carBrand, carYear, carModel from Cars;

comment puis-je résoudre ce problème?

10
EmreAltun

essayer

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

DISTINCT fonctionne sur toute la ligne, pas sur une colonne spécifique. Si vous souhaitez obtenir les noms uniques, sélectionnez uniquement cette colonne.

SELECT DISTINCT carBrand FROM Cars
17
Mark Byers

Je ne sais pas pourquoi la réponse acceptée a été acceptée et je ne comprends certainement pas pourquoi elle a été votée positivement, mais le PO contient les éléments suivants dans la question:

J'ai écrit ça, mais ce n'est pas ce que je veux.

select DISTINCT carBrand, carYear, carModel from Cars;

La réponse acceptée a suggéré d'utiliser:

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

qui renvoie exactement le même résultat que la requête de l'OP. En fait, la suggestion dans la réponse (utiliser le groupe par) n'est même pas encouragée à être utilisée pour obtenir des résultats distincts mais devrait être utilisée pour l'agrégation. Voir this réponse pour plus d'informations.

De plus, SQL Server est suffisamment intelligent pour comprendre que s'il n'y a pas de fonction d'agrégation dans la requête, la requête demande en fait distinct donc elle utilisera distinct sous le capot.

Distinct fera une distinction sur toute la ligne, comme @MarkByers l'a indiqué dans sa réponse.

Pour ceux qui veulent tester ce qui précède, voici un script qui va créer un tableau à 3 colonnes puis le remplir de données. Les deux (distinct et group by) renverra le même jeu de résultats.

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

Les deux requêtes renverront ce résultat:

carBrand    carYear    carModel
BMW         2000       328 i
BMW         2000       3M

Conclusion

Ne pas utiliser group by si vous voulez des enregistrements distincts. Utilisez distinct. Utilisation group by lorsque vous utilisez une fonction d'agrégation telle que SUM, COUNT etc.

8
CodingYoshi

Cela dépend de ce que vous voulez. Par exemple, si vous voulez "Toyota Corolla" et "Toyota Camry", mais ignorez l'année, vous pouvez le faire:

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