2017-07-26 2 views
1

Ich habe einige doppelte Mail in meiner Datenbank, aber ich kann es nicht entfernen. Ich möchte ein Feld auswählen, aber ohne doppelte Mail.Wie kann ich eine eindeutige mit mehreren Feld

Ich habe eine Anfrage wie folgt aus:

SELECT 
DISTINCT MAIL, 
ID, 
CIVILITE, 
PRENOM, 
NAME 
FROM CONTACT WHERE CODE_PAYS = 'DE' 

Wenn ich diese Anfrage zu starten, meine doppelte Werte auf Mail sind bereits hier.

Wissen Sie, wie kann ich das tun?


aktualisieren: Ich habe this Ansatz versucht, aber ich brauche es in einer Ansicht zu verwenden:

ALTER VIEW ALL_VW_CONTACT_DE WITH SCHEMABINDING 
AS 
with cte as 
(
    select rn = row_number() over (partition by c.Mail Order By c.Id asc), c.Mail, c.Id, c.Civilite, c.Prenom, c.Name 
    from dbo.CONTACT c 
    where code_pays = 'DE' 
) 
select Mail, Id, Civilite, Prenom, Name 
from cte 
where rn = 1 

Aber dies nicht funktioniert, ich diesen Fehler:

Cannot schema bind view 'MY_TABLE' because name 'CONTACT' is invalid for schema binding. Name must be in two-part format and an object cannot reference itself

+1

Hinzufügen der erwarteten Daten der Beispieldaten –

+0

Distinct wird auf alle Felder angewendet. Nicht nur der neben ihm. So stellt es sicher, dass nur eine Zeile dieselbe Mail-, ID-, Civilite-, Prenom-, Name-Kombination hat. – litelite

+0

ist es möglich, eine DISTINCT nur auf meine Feldpost hinzuzufügen? – dutycorpse

Antwort

3

Sie verwenden row_number können unter

Select top (1) with ties * from Contact 
    where CODE_PAYS = 'DE' 
    order by row_number() over(partition by mail order by id) 
6

When I launch this request, my duplicate values on mail are already here.

Der Grund dafür ist, dass DISTINCT nicht funktioniert wie du denkst. Es wird nicht nur die erste Spalte nach dem Schlüsselwort DISTINCT angezeigt, sondern alle Spalten in der Liste. Nur wenn alle gleich sind, wird es als Duplikat betrachtet.

Ein einfacher Weg ist mit ROW_NUMBER:

with cte as 
(
    select rn = row_number() over (partition by c.Mail Order By c.Id asc), c.* 
    from dbo.Contact c 
    where Code_Pays = 'DE' 
) 
select Mail, Id, Civilite, Prenom, Name 
from cte 
where rn = 1 

Ändern Sie den order by, wenn Sie einen anderen Datensatz zu wollen, hier nehme ich das mit min-ID.

+0

Wo kann ich die Klausel wo für meine code_pays? Wenn ich nach dbo.Kontakt funktioniert dies nicht – dutycorpse

+0

@dutycorpse: in der allgemeinen Tabelle Ausdruck, ich habe meine Antwort bearbeitet –

+0

Ich habe einen Fehler: Kann nicht binden Ansicht 'MY_TABLE' binden, weil der Name 'CONTACT' ist für Schema verbindlich.Name muss im zweiteiligen Format sein und ein Objekt kann sich nicht selbst referenzieren – dutycorpse

1

Wenn Sie DISTINCT mit anderen Feldern verwenden, erhalten Sie nur Originalkombinationen dieser Felder.

Für diesen Fall sollten Sie alle dynamischen Felder aus Abfrage (möglicherweise ID) ausschließen:

SELECT 
DISTINCT MAIL, 
CIVILITE, 
PRENOM, 
NAME 
FROM CONTACT WHERE CODE_PAYS = 'DE' 
0

Das Problem hier ist wahrscheinlich das ID-Feld. Da es für jede Zeile eindeutig sein sollte, können Sie die anderen Felder nicht gruppieren. Entfernen Sie es aus der Abfrage und Sie sollten in Ordnung sein.

Wenn Sie eine eindeutige Abfrage durchführen, besteht der Trick darin, sich die Ergebnisse anzusehen und zu ermitteln, welche Spalten unterschiedliche Werte zurückgeben, was sie unterscheidet. Wenn Sie die Ergebnisse in Ihrer Frage hinzufügen, können wir Ihnen weiter helfen.

Verwandte Themen