SQL/mysql - Select distinct/UNIQUES, mais le retour de 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
- Pourquoi ne pas
SELECT DISTINCT * FROM table
ne fonctionne pas pour vous? - Si votre table a un PK toutes les lignes doivent être
distinct
par définition. Si vous essayez de sélectionnerDISTINCT field1
, mais en quelque sorte de retour de toutes les autres colonnes de ce qui doit arriver pour les colonnes qui ont plus d'une valeur pour un particulierfield1
valeur? Vous devez utiliserGROUP BY
et une sorte d'agrégation sur les autres colonnes par exemple. - Si vous voulez lignes répétées et non seulement des lignes distinctes, retirez la clé distinctes mot.
- Pourriez-vous nous donner un exemple de ce que vous attendez les résultats ressembler? Jusqu'à présent, je ne peux pas faire tout le sens de votre requête souhaitée.
- Je veux seulement le champ de 1 un de l'autre, DISTINCT * ne fonctionne pas
- Ici est la réponse à la même question posée, vous devez d'abord obtenir la colonne distincte, avec leur id et ensuite joindre à la table d'origine. SELECT DISTINCT sur une colonne, retourner plusieurs autres colonnes
- Qui sgbd que vous utilisez? Multiples et contradictoires/confus réponses ci-dessous. (Réponses aux questions tagged avec SQL doivent utiliser la norme ISO/IEC standard SQL.)
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la recherche d'un groupe par:
Qui peut parfois être écrit avec un distinct sur l'énoncé:
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:
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.
row_number() over (partition by field1) row_number
The ranking function "row_number" must have an ORDER BY clause
. Nous devons ajouter la clause order by, après la partition par champ1. Donc la bonne requête seraselect * from ( select *, row_number() over (partition by field1 order by orderbyFieldName) as row_number from table ) as rows where row_number = 1
GROUP BY
select *, row_number() over (partition by field1 order by field2) as row_number from table
. Vous devez utiliser de manière explicite le nom de la table/alias dans la requête selectselect **table**.*, row_number() over (partition by field1 order by field2) as row_number from table
select distinct on field1 * from table;
Cela ne semble pas être la syntaxe correcte pour mysql - au moins pas de plus.select distinct on (field1) * from table
; fonctionne également dans PostgreSQLÀ 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
niGROUP BY
, parce que le résultat n'est pas déterminé.Pensez-y comme ça: si votre
field1
se produit plus d'une fois, quelle est la valeur defield2
seront répertoriés (étant donné que vous avez la même valeur pourfield1
en deux lignes, mais deux valeurs distinctes defield2
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 deDISTINCT
:SELECT field1, MIN(field2), MIN(field3), MIN(field4), .... FROM table GROUP BY field1
, et champ2, 3, 4,,, ne sont pas tenus d'être des entiers (ou d'autres caractères), ils peuvent être de type char champssum(cast(COL as int)) > 0
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 faites votre recherche:
Il affichera 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:
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.
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.
C
alias
quand il peut fonctionner sans elle? en ligneFROM dbo.TABLE AS C
C'est vraiment une bonne question. J'ai lu quelques réponses utiles ici déjà, mais sans doute, je peux ajouter une explication plus précise.
Réduire le nombre de résultats d'une requête avec une instruction GROUP BY est facile aussi longtemps que vous n'avez pas de requête d'informations supplémentaires. Supposons que vous avez obtenu le tableau suivant "lieux".
Maintenant la requête
permettra:
Toutefois, la requête suivante
...déclenche une erreur dans MS SQL, car comment votre ordinateur savoir lequel des trois villes françaises "Lyon", "Paris" ou "Marseille" que vous souhaitez lire dans le champ à droite de "la France"?
Afin de corriger la deuxième requête, vous devez ajouter cette information. Une façon de le faire est d'utiliser la fonction MAX() et MIN(), la sélection de la plus grande ou la plus petite valeur parmi tous les candidats. MAX() et MIN() ne sont pas seulement applicable à des valeurs numériques, mais aussi de comparer l'ordre alphabétique de la chaîne de valeurs.
permettra:
ou:
permettra:
Ces fonctions sont une bonne solution aussi longtemps que vous êtes bien avec la sélection de votre valeur à partir des deux extrémités de l'ordre alphabétique (ou numérique) de commande. Mais que faire si ce n'est pas le cas? Supposons que vous avez besoin d'une valeur avec une certaine caractéristique, par exemple en commençant avec la lettre "M". Maintenant, les choses se compliquent.
La seule solution que j'ai pu trouver jusqu'à présent est de mettre l'ensemble de votre requête dans une sous-requête, la construction de la colonne supplémentaire à l'extérieur d'elle par des mains:
permettra:
Grande question @aryaxt -- vous pouvez dire que c'était une excellente question, parce que vous l'a demandé il y a 5 ans et je suis tombé sur ça aujourd'hui en essayant de trouver la réponse!
J'ai juste essayé de modifier la accepté de répondre à inclure, mais dans le cas de mon édition ne pas se rendre dans:
Si votre table n'était pas grande, et en supposant que votre clé primaire est une auto-incrémentation entier, vous pourriez faire quelque chose comme ceci:
WHERE noDupes is not NULL
- pas de colonne spécifié pour la tablenoDupes
, est-ce correct?Vous pouvez le faire avec un
WITH
clause.Par exemple:
Cela vous permet également de sélectionner uniquement les lignes sélectionnées dans la
WITH
clauses de la requête.Pour SQL Server, vous pouvez utiliser le dense_rank supplémentaires et de fonctions de fenêtrage pour obtenir toutes les lignes ET colonnes avec des valeurs dupliquées sur les colonnes spécifiées. Voici un exemple...
C'est de prendre un nombre de lignes pour chaque combinaison distincte de col1, col2 et col3.
Essayer
dans
ORDER BY
je viens de mettre exemple ici, vous pouvez également ajouter un champ ID dans ceAjouter un GROUPE PAR champ dont vous voulez vérifier les doublons
votre requête peut ressembler à
champ1 sera vérifiée à exclure les enregistrements en double
ou vous pouvez interroger comme
doublons de champ1 sont exclus de SÉLECTIONNER
filed2 must appear in the GROUP BY clause or be used in an aggregate function
Intégrer l'ensemble de vos champs dans la clause GROUP BY.
Il peut être fait par requête interne
SELECT DISTINCT CHAMP1, CHAMP2, CHAMP3 from TABLE1 fonctionne si les valeurs de tous les trois colonnes sont uniques dans la table.
Si, par exemple, vous avez plusieurs valeurs identiques pour le prénom, mais le nom de famille et d'autres informations dans les colonnes sélectionnées est différent, l'enregistrement sera inclus dans le jeu de résultats.
Je conseille
de cette façon, si vous avez la même valeur dans champ1 sur plusieurs lignes, tous les dossiers seront retournés.
SELECT * FROM table;
. Encore plus, Il est lent.