J'ai besoin d'interroger une table pour renvoyer des lignes, mais je ne suis pas en mesure d'interroger la table correctement. Voici ma vue de table:
Id MailId EmailAddress Name
1 1 [email protected] Mr. A
2 1 [email protected] Mr. B
3 1 [email protected] Mr. C
4 1 [email protected] Mr. D
5 1 [email protected] Mr. A
6 2 [email protected] Mr. E
7 2 [email protected] Mr. A
8 3 [email protected] Mr. F
9 4 [email protected] Mr. D
10 5 [email protected] Mr. F
11 6 [email protected] Mr. D
L'ensemble de résultats doit retourner:
Id MailId EmailAddress Name
1 1 [email protected] Mr. A
2 1 [email protected] Mr. B
3 1 [email protected] Mr. C
4 1 [email protected] Mr. D
6 2 [email protected] Mr. E
8 3 [email protected] Mr. F
En d'autres termes: tout d'abord, je souhaite sélectionner des adresses de messagerie distinctes, puis renvoyer des lignes contenant des adresses de messagerie distinctes.
Remarque: Le simple fait d'utiliser le mot-clé "Distinct" ne fonctionnera pas ici, car il sélectionnera des lignes distinctes. Mon exigence est de sélectionner des adresses e-mail distinctes, puis de sélectionner des lignes contenant ces adresses.
Edit: Je ne peux pas non plus utiliser le mot-clé "Group By", car pour cela je devrai également Grouper avec Id (qui est le PK) et cela retournera deux lignes avec les mêmes valeurs EmailAddress mais avec des identifiants différents.
En regardant votre sortie, la requête suivante peut fonctionner, essayez-la:
SELECT * FROM tablename
WHERE id IN
(SELECT MIN(id) FROM tablename GROUP BY EmailAddress)
Cela ne sélectionnera qu'une seule ligne pour chaque adresse e-mail distincte, la ligne avec le minimum id
qui est ce que votre résultat semble représenter
Essayez ceci - vous avez besoin d'un CTE (Common Table Expression) qui partitionne (groupe) vos données par adresse e-mail distincte et trie chaque groupe par ID - le plus petit en premier. Ensuite, il vous suffit de sélectionner la première entrée pour chaque groupe - cela devrait vous donner ce que vous recherchez:
;WITH DistinctMails AS
(
SELECT ID, MailID, EMailAddress, NAME,
ROW_NUMBER() OVER(PARTITION BY EMailAddress ORDER BY ID) AS 'RowNum'
FROM dbo.YourMailTable
)
SELECT *
FROM DistinctMails
WHERE RowNum = 1
Cela fonctionne sur SQL Server 2005 et plus récent (vous n'avez pas mentionné ce que version vous utilisez ...)
utilisez ceci (supposez que votre nom de table est des e-mails):
select * from emails as a
inner join
(select EmailAddress, min(Id) as id from emails
group by EmailAddress ) as b
on a.EmailAddress = b.EmailAddress
and a.Id = b.id
j'espère que cette aide ..
Je ne suis pas sûr de votre SGBD. J'ai donc créé une table temporaire dans Redshift et d'après mon expérience, je pense que cette requête devrait retourner ce que vous recherchez:
select min(Id), distinct MailId, EmailAddress, Name
from yourTableName
group by MailId, EmailAddress, Name
Je constate que j'utilise un GROUP BY clause
mais vous n'aurez toujours pas deux lignes contre un MailId
particulier.