So vermeiden Sie Duplikate in der SQL-Abfrage über drei verbundene Tabellen

8

Ich erhalte Dubletten, wenn ich zwei LINKE VERBINDUNGEN mache, um zum "event_name" in meinem Beispiel unten zu kommen. Ich bekomme 112 Fälle damit auf diese Weise eingerichtet. Wenn ich jedoch die 2 LINKEN VERBINDUNGSLINIEN loswerde und die Abfrage ausführe, erhalte ich die richtigen 100 Datensätze ohne Duplikate. Ich habe versucht DISTINCT mit dem Code unten, aber ich bekomme immer noch 112 mit Duplikaten.

%Vor%

Wie kann ich angeben, dass ich nur genau 100 Fälle von "Fällen" möchte, und dass ich nichts von den Tabellen in den Joins möchte, um weitere Zeilen zu erzeugen?

Danke!

    
Chain 19.12.2012, 00:39
quelle

3 Antworten

7

Sie müssen Ihre ON-Klausel um eine Bedingung erweitern, damit für jeden Eintrag in cases nur ein Eintrag in middle_table vorhanden ist, der der Bedingung entspricht und für jeden Eintrag in middle_table nur ein Eintrag vorhanden ist in event :

%Vor%

Sie können natürlich DISTINCT verwenden. Wenn dies nicht funktioniert, bedeutet dies, dass sich Ihre Ergebnisse in den Feldern cases.id , cases.date , cases.name und event.event_name unterscheiden. Untersuchen Sie die Ergebnisse und entscheiden Sie, welche der Einträge Sie wegwerfen möchten, und schließen Sie diese Bedingung in Ihre ON-Klausel ein.

    
AndreKR 19.12.2012, 00:46
quelle
5

Das Problem besteht darin, dass Sie in den Tabellen, mit denen Sie verbunden sind, mehrere Übereinstimmungen haben. Effektiv sagt dein Code:

%Vor%

Wenn ein Elternteil zwei Kinder hat, bekommen Sie beides; also erscheint der Elternteil zweimal.

Wenn Sie nur den Elternteil erhalten möchten, sobald Sie Kompromisse eingehen müssen; Du kannst nicht beide Kinder haben. Führen Sie entweder eine Aggregatfunktion für Spalten aus der Kindtabelle aus und führen Sie eine Gruppe nach Spalten aus der Elterntabelle aus, oder verwenden Sie rownumber() over partition by (list,of,parent,columns order by list,of,child,columns) r in einer inneren Anweisung und where r=1 in einer äußeren Anweisung, wie unten:

%Vor%

oder

%Vor%

AKTUALISIEREN

Wie in den Kommentaren erwähnt, können Sie, wenn die Kinddaten genau gleich sind, dies tun:

%Vor%

oder (wenn ein paar Felder unterschiedlich sind, aber es ist dir egal, was du bekommst)

%Vor%     
JohnLBevan 19.12.2012 00:51
quelle
1

Die Duplikate sind das Ergebnis mehrerer Felder für "middle_table" und "event" für "cases". Sie können die Auswahl auf die Werte beschränken, die eindeutig sind, indem Sie das Schlüsselwort "GROUP BY" (das normalerweise zum Zusammenstellen von Funktionen wie COUNT und SUM verwendet wird) wie folgt verwenden:

%Vor%     
Michael Durrant 19.12.2012 01:56
quelle

Tags und Links