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
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
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.
À 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
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.
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 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.