it-swarm.com.de

wie man Zeilen nur basierend auf bestimmten Werten von A COLUMN auswählt

Ich muss eine Tabelle abfragen, um Zeilen zurückzugeben, kann die Tabelle jedoch nicht korrekt abfragen. Hier ist meine Tabellenansicht:

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

Die Ergebnismenge sollte Folgendes zurückgeben:

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

Mit anderen Worten: Zuerst möchte ich verschiedene E-Mail-Adressen auswählen und dann Zeilen mit verschiedenen E-Mail-Adressen zurückgeben.

Hinweis: Nur das Schlüsselwort "Distinct" kann hier nicht verwendet werden, da hier verschiedene Zeilen ausgewählt werden. Meine Anforderung besteht darin, bestimmte E-Mail-Adressen und dann Zeilen mit diesen Adressen auszuwählen.

Edit: Ich kann auch das Schlüsselwort "Group By" nicht verwenden, da ich dazu auch Group By with Id (das ist die PK) verwenden muss und dabei zwei Zeilen mit denselben EmailAddress-Werten zurückgeben muss aber mit unterschiedlichen Ids.

27
user576510

Wenn Sie sich Ihre Ausgabe ansehen, kann möglicherweise die folgende Abfrage funktionieren:

SELECT * FROM tablename
WHERE id IN
(SELECT MIN(id) FROM tablename GROUP BY EmailAddress)

Dadurch wird nur eine Zeile für jede einzelne E-Mail-Adresse ausgewählt, die Zeile mit dem Mindestwert von id, den Ihr Ergebnis darzustellen scheint

56
danishgoel

Versuchen Sie dies - Sie benötigen einen CTE (Common Table Expression), der Ihre Daten nach eindeutiger E-Mail-Adresse partitioniert (gruppiert) und jede Gruppe nach ID sortiert - die kleinste zuerst. Dann wählen Sie einfach den ersten Eintrag für jede Gruppe aus - das sollte Ihnen das geben, wonach Sie suchen:

;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

Dies funktioniert auf SQL Server 2005 und neuer (Sie haben nicht erwähnt, was Version Sie verwenden ...)

16
marc_s

benutze dies (nimm an, dass dein Tabellenname emails ist):

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

ich hoffe das hilft..

2
Setmax

Ich bin mir nicht sicher über Ihr DBMS. Daher habe ich in Redshift eine temporäre Tabelle erstellt. Aus meiner Erfahrung heraus sollte diese Abfrage das zurückgeben, wonach Sie suchen:

select min(Id), distinct MailId, EmailAddress, Name
    from yourTableName
    group by MailId, EmailAddress, Name

Ich sehe, dass ich einen GROUP BY clause Verwende, aber Sie werden immer noch keine zwei Zeilen für ein bestimmtes MailId haben.

0