Angenommen, ich habe die folgende Abfrage.
SELECT ID, Email, ProductName, ProductModel FROM Products
Wie kann ich es so ändern, dass keine doppelten E-Mails zurückgegeben werden?
Mit anderen Worten, wenn mehrere Zeilen dieselbe E-Mail enthalten, soll das Ergebnis nur eine dieser Zeilen enthalten (vorzugsweise die letzte). Duplikate in anderen Spalten sollten zulässig sein.
Klauseln wie DISTINCT
und GROUP BY
scheinen für ganze Zeilen zu funktionieren. Ich bin mir also nicht sicher, wie ich das angehen soll.
sql
sql-server
Jonathan Wood
quelle
quelle
Antworten:
Wenn Sie SQL Server 2005 oder höher verwenden, verwenden Sie Folgendes:
EDIT: Beispiel mit einer where-Klausel:
quelle
SELECT
braucht einenWHERE
Zustand. Ich denke, die Zeilennummern werden allen Zeilen in der Tabelle zugewiesen. Diese Syntax ist mir ein wenig unverständlich. Gibt es eine Chance auf ein Update, das eine Zeile mit einer bestimmten E-Mail garantiert, die dieWHERE
Bedingung erfüllt?JOIN
s enthält. Sobald ich a habeJOIN
,ROW_NUMBER
gibt das viel höhere Werte als "1" zurück.Dies setzt SQL Server 2005+ voraus und Ihre Definition von "last" ist die maximale PK für eine bestimmte E-Mail
quelle
Wenn Sie es verwenden
DISTINCT
, stellen Sie es sich als eine bestimmte Zeile vor, nicht als eine Spalte. Es werden nur Zeilen zurückgegeben, in denen die Spalten nicht genau übereinstimmen.Die Abfrage würde beide Zeilen zurückgeben, da die
ID
Spalte unterschiedlich ist. Ich gehe davon aus, dass dieID
Spalte eineIDENTITY
inkrementierende Spalte ist. Wenn Sie die letzte zurückgeben möchten, empfehle ich Folgendes:Der
TOP 1
gibt nur den ersten Datensatz zurück. Wenn Sie ihn nachID
absteigend sortieren, werden die Ergebnisse mit der letzten Zeile zuerst zurückgegeben. Dies gibt Ihnen die letzte Aufzeichnung.quelle
Sie können dies mit der GROUP BY-Funktion beheben
quelle
SELECT id, max(email) AS email FROM tbl GROUP by email
. In SQL Server müssen sich ALLE Spalten in derSELECT
Klausel in einer Aggregatfunktion befinden. Das beißt mich jedes Mal, wenn ich zurückgehe.Für Access können Sie die hier ausgewählte SQL Select-Abfrage verwenden:
Zum Beispiel haben Sie diese Tabelle:
KUNDE || NOMBREN || MAIL
888 || T800 ARNOLD || [email protected]
123 || JOHN CONNOR || [email protected]
125 || SARAH CONNOR ||[email protected]
Und Sie müssen nur bestimmte Mails auswählen. Sie können es damit machen:
SQL SELECT:
Sie können dies verwenden, um die maximale ID auszuwählen, den Korrespondenznamen zu dieser maximalen ID. Auf diese Weise können Sie jedes andere Attribut hinzufügen. Am Ende setzen Sie die zu filternde eindeutige Spalte und gruppieren sie nur mit dieser letzten eindeutigen Spalte.
Dadurch erhalten Sie die maximale ID mit den entsprechenden Daten. Sie können min oder andere Funktionen verwenden und diese Funktion in die Unterabfragen replizieren.
Diese Auswahl gibt Folgendes zurück:
KUNDE || NOMBREN || MAIL
888 || T800 ARNOLD || [email protected]
125 || SARAH CONNOR ||[email protected]
Denken Sie daran, die ausgewählten Spalten zu indizieren, und die jeweilige Spalte darf nicht alle numerischen Daten in Groß- oder Kleinbuchstaben enthalten, da dies sonst nicht funktioniert. Dies funktioniert auch mit nur einer registrierten Mail. Viel Spaß beim Codieren !!!
quelle
Der Grund
DISTINCT
und dieGROUP BY
Arbeit an ganzen Zeilen ist, dass Ihre Abfrage ganze Zeilen zurückgibt.Zum besseren Verständnis: Versuchen Sie, von Hand zu schreiben, was die Abfrage zurückgeben soll, und Sie werden feststellen, dass es nicht eindeutig ist, was in die nicht duplizierten Spalten eingefügt werden soll.
Wenn es Ihnen buchstäblich egal ist, was in den anderen Spalten steht, geben Sie sie nicht zurück. Die Rückgabe einer zufälligen Zeile für jede E-Mail-Adresse erscheint mir etwas nutzlos.
quelle
Versuche dies
quelle
Versuche dies:
quelle