SQL-Tabelle mit sich selbst vergleichen (Self-Join)

8

Ich versuche doppelte Zeilen zu finden, die auf gemischten Spalten basieren. Dies ist ein Beispiel für das, was ich habe:

%Vor%

Nun, wenn ich diese Abfrage ausführen:

%Vor%

Ich würde erwarten, beide IDs zurückzubekommen. (1 und 2), aber ich bekomme immer nur die eine Zeile zurück.

Meine Gedanken wären, dass es jede Reihe vergleichen sollte, aber ich denke, das ist nicht richtig? Um das zu beheben, hatte ich meine Abfrage folgendermaßen geändert:

%Vor%

Das gibt mir beide Zeilen, aber die Leistung verschlechtert sich extrem schnell basierend auf der Anzahl der Zeilen.

Die letzte Lösung für Leistung und Ergebnisse war die Verwendung einer Verbindung:

%Vor%

Aber insgesamt fehlt mir offensichtlich das Verständnis, warum das nicht funktioniert, was bedeutet, dass ich wahrscheinlich etwas falsch mache. Könnte mir jemand in die richtige Richtung zeigen?

    
Kyle 11.12.2009, 19:40
quelle

4 Antworten

10

Nicht an einer Ungleichheit teilnehmen; Es scheint, dass die JOIN- und WHERE-Bedingungen invertiert sind.

%Vor%

Sollte gut funktionieren.

    
Aaronaught 11.12.2009, 19:47
quelle
5

Sie erhalten nur beide IDs zurück, wenn Sie sie auswählen:

%Vor%

Der Grund dafür, dass nur eine Zeile erhalten wird, ist, dass nur eine Zeile (nämlich Zeile # 2) eine TEST1 hat, die der TEST2 einer anderen Zeile entspricht.

    
Klaus Byskov Pedersen 11.12.2009 19:48
quelle
2

Ich sehe aus, als würdest du sehr schnell auf ein Cartiesian Join hinarbeiten. Normalerweise müssen Sie, wenn Sie nach Duplikaten suchen, Folgendes ausführen:

%Vor%

Wenn Sie die Spalten mischen müssen, dann mischen Sie die benötigten Bedingungen, aber tun Sie etwas wie:

%Vor%

Damit vergleichen Sie in jedem Join die Rechte mit der linken und der rechten mit der rechten Seite, wodurch die WHERE ganz überflüssig wird.

Dieser Abfragetyp wächst jedoch exponentiell in der Ausführungszeit für jede in die Tabelle eingefügte Zeile, da Sie jede Zeile mit jeder Zeile vergleichen.

    
Nathan Wheeler 11.12.2009 19:53
quelle
0

Dies kann ohne innere Verbindungen geschehen, wenn ich mich nicht irre. Dies ist das erste Mal, dass ich eine Frage von MySQL beantworte, aber ich beantworte nur, um hier auf StackOverflow mehr Punkte zu bekommen. Das Komma ist sehr wichtig, damit sich MySQL nicht beschweren kann.

%Vor%     
lucky85dog 01.12.2012 18:53
quelle

Tags und Links