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?
essayer
SELECT carBrand , carYear ,carModel
FROM Cars
GROUP BY carBrand , carYear ,carModel;
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
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.
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;