478 votes

SQL - Select distinct mais retourner toutes les colonnes?

SELECT DISTINCT field1, field2, field3, ......   FROM table

Je suis en train d'accomplir l'instruction sql suivante, mais je veux retourner toutes les colonnes est-ce possible? Quelque chose comme:

SELECT DISTINCT field1, * from table

487voto

Denis Points 34131

Vous êtes à la recherche d'un groupe par:

select *
from table
group by field1

Ce qui peut parfois être écrit avec un distinct sur l'énoncé:

select distinct on field1 *
from table

Sur la plupart des plates-formes, cependant, ni de la ci-dessus fonctionne, parce que le comportement sur les autres colonnes est pas spécifié. (Le premier fonctionne avec MySQL, si c'est ce que vous utilisez.)

Vous pouvez récupérer les différents champs et le bâton de choisir un seul arbitraire de ligne à chaque fois.

Sur certaines plates-formes (par exemple, PostgreSQL, Oracle, T-SQL), ce qui peut être fait directement à l'aide de fonctions de la fenêtre:

select *
from (
   select *,
          row_number() over (partition by field1 order by field2) as row_number
   from table
   ) as rows
where row_number = 1

Sur les autres (MySQL, SQLite), vous aurez besoin d'écrire les sous-requêtes qui fera de vous joindre à l'ensemble de la table avec elle-même (exemple), donc pas recommandée.

83voto

Costi Ciudatu Points 13020

À partir de la formulation de votre question, je comprends que vous souhaitez sélectionner les valeurs distinctes pour un champ donné, et pour chaque valeur de disposer de toutes les autres valeurs de la colonne dans la même ligne. La plupart des Sgbd ne permettra pas cela avec ni DISTINCT ni GROUP BY,, parce que le résultat n'est pas déterminé.

Pensez-y comme ça: si votre field1 plus d'une fois, quelle est la valeur de field2 seront répertoriés (étant donné que vous avez la même valeur pour field1 en deux lignes, mais deux valeurs distinctes de field2 dans ces deux lignes).

Toutefois, vous pouvez utiliser les fonctions d'agrégation (explicitement pour chaque champ que vous souhaitez être indiqué) et à l'aide d'un GROUP BY au lieu de DISTINCT:

SELECT field1, MAX(field2), COUNT(field3), SUM(field4), .... FROM table GROUP BY field1

32voto

rocklandcitizen Points 200

Si j'ai bien compris votre problème correctement, il est semblable à l'une j'ai juste eu. Vous voulez être en mesure de limiter l'utilisation de DISTINCT d'un champ spécifié, plutôt que de l'appliquer à toutes les données.

Si vous utiliser GROUP BY sans une fonction d'agrégation, qui jamais terrain vous GROUPE PAR sera votre DISTINCTES déposées.

Si vous faire de votre requête:

SELECT * from table GROUP BY field1;

Il montrera tous vos résultats sur la base d'une seule instance de champ1.

Par exemple, si vous avez une table avec le nom, l'adresse et la ville. Une seule personne a plusieurs adresses enregistrées, mais vous voulez juste une adresse unique pour la personne, vous pouvez requête comme suit:

SELECT * FROM persons GROUP BY name;

Le résultat sera qu'une seule instance de ce nom apparaîtra avec son adresse, et l'autre sera omis dans le tableau résultant. Attention: si votre champs ont des valeurs atomiques telles que firstName, lastName vous voulez grouper par deux.

SELECT * FROM persons GROUP BY lastName, firstName;

parce que si deux personnes ont le même nom de famille et vous seul groupe par le nom de famille, l'une de ces personnes sera omis dans les résultats. Vous devez garder ces choses en considération. Espérons que cette aide.

15voto

Stormy Points 97
SELECT  c2.field1 ,
        field2
FROM    (SELECT DISTINCT
                field1
         FROM   dbo.TABLE AS C
        ) AS c1
        JOIN dbo.TABLE AS c2 ON c1.field1 = c2.field1

3voto

user2225399 Points 29

Vous pouvez le faire avec un WITH de la clause.

Par exemple:

WITH c AS (SELECT DISTINCT a, b, c FROM tableName)
SELECT * FROM tableName r, c WHERE c.rowid=r.rowid AND c.a=r.a AND c.b=r.b AND c.c=r.c

Cela vous permet également de sélectionner uniquement les lignes sélectionnées dans l' WITH clauses de la requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X