Disons que j'ai la requête suivante.
SELECT ID, Email, ProductName, ProductModel FROM Products
Comment puis-je le modifier pour qu'il ne renvoie aucun e-mail en double?
En d'autres termes, lorsque plusieurs lignes contiennent le même e-mail, je souhaite que les résultats n'incluent qu'une seule de ces lignes (de préférence la dernière). Les doublons dans d'autres colonnes doivent être autorisés.
Les clauses aiment DISTINCT
et GROUP BY
semblent fonctionner sur des lignes entières. Je ne sais donc pas comment aborder cela.
sql
sql-server
Jonathan Wood
la source
la source
Réponses:
Si vous utilisez SQL Server 2005 ou supérieur, utilisez ceci:
EDIT: Exemple utilisant une clause where:
la source
SELECT
besoin d'uneWHERE
condition. Je pense que les numéros de ligne seront attribués à toutes les lignes du tableau. Cette syntaxe me dépasse un peu. Y a-t-il une chance d'une mise à jour qui garantirait une ligne avec un e-mail particulier remplissant laWHERE
condition?JOIN
s dans ma requête. Dès que j'ai unJOIN
, leROW_NUMBER
retourne des valeurs beaucoup plus élevées que "1".Cela suppose que SQL Server 2005+ et que votre définition de «dernier» est le PK maximal pour un e-mail donné
la source
Lorsque vous utilisez,
DISTINCT
pensez-y comme une ligne distincte et non comme une colonne. Il ne renverra que les lignes dont les colonnes ne correspondent pas exactement.La requête renverrait les deux lignes car la
ID
colonne est différente. Je suppose que laID
colonne est uneIDENTITY
colonne qui s'incrémente, si vous voulez retourner la dernière, je recommande quelque chose comme ceci:Le
TOP 1
renverra uniquement le premier enregistrement, en le triant par ordreID
décroissant, il retournera les résultats avec la dernière ligne en premier. Cela vous donnera le dernier enregistrement.la source
Vous pouvez sur cela en utilisant la fonction GROUP BY
la source
SELECT id, max(email) AS email FROM tbl GROUP by email
. Dans le serveur SQL, TOUTES les colonnes de laSELECT
clause doivent être dans une fonction d'agrégation. Cela me mord à chaque fois que j'y retourne.Pour Access, vous pouvez utiliser la requête SQL Select que je présente ici:
Par exemple, vous avez ce tableau:
CLIENTE || NOMBRES || COURRIER
888 || T800 ARNOLD || [email protected]
123 || JOHN CONNOR || [email protected]
125 || SARAH CONNOR ||[email protected]
Et vous devez sélectionner uniquement des e-mails distincts. Vous pouvez le faire avec ceci:
SÉLECTION SQL:
Vous pouvez l'utiliser pour sélectionner l'ID maximum, le nom correspondant à cet ID maximum, vous pouvez ajouter tout autre attribut de cette manière. Ensuite, à la fin, vous mettez la colonne distincte à filtrer et vous ne la regroupez qu'avec cette dernière colonne distincte.
Cela vous apportera l'ID maximum avec les données correspondantes, vous pouvez utiliser min ou toute autre fonction et vous répliquez cette fonction dans les sous-requêtes.
Cette sélection retournera:
CLIENTE || NOMBRES || COURRIER
888 || T800 ARNOLD || [email protected]
125 || SARAH CONNOR ||[email protected]
N'oubliez pas d'indexer les colonnes que vous sélectionnez et la colonne distincte ne doit pas contenir de données numériques en majuscules ou en minuscules, sinon cela ne fonctionnera pas. Cela fonctionnera également avec un seul courrier recommandé. Bon codage !!!
la source
La raison
DISTINCT
et leGROUP BY
travail sur des lignes entières est que votre requête renvoie des lignes entières.Pour vous aider à comprendre: essayez d'écrire à la main ce que la requête doit renvoyer et vous verrez que ce qu'il faut mettre dans les colonnes non dupliquées est ambigu.
Si vous ne vous souciez littéralement pas de ce qui se trouve dans les autres colonnes, ne les renvoyez pas. Renvoyer une ligne aléatoire pour chaque adresse e-mail me semble un peu inutile.
la source
Essaye ça
la source
Essaye ça:
la source