2017-04-22 3 views
-1

Ich machte eine Abfrage und wollte keine Duplikate, aber ich habe einige Male 3 Duplikate und wenn ich DISTINCT oder DISTINCTROW verwendet habe ich nur 2 Duplikate.Zugriff auf SQL-Abfrage ohne doppelte Ergebnisse

SELECT f.flight_code, 
     f.status, 
     a.airport_name, 
     a1.airport_name, 
     f.departing_date+f.departing_time AS SupposedDepartingTime, 
     f.landing_date+f.landing_time AS SupposedLandingTime, 
     de.actual_takeoff_date+de.actual_takeoff_time AS ActualDepartingTime, 
     SupposedLandingTime+(ActualDepartingTime-SupposedDepartingTime) AS ActualLandingTime 
FROM 
(((Flights AS f 
    LEFT JOIN Aireports AS a 
     ON a.airport_code = f.depart_ap) 
    LEFT JOIN Aireports AS a1 
     ON f.target_ap = a1.airport_code) 
    LEFT JOIN Irregular_Events AS ie 
     ON f.flight_code = ie.flight_code) 
    LEFT JOIN Delay_Event AS de 
     ON ie.IE_code = de.delay_code; 

hatte LEFT JOIN zu verwenden, weil, wenn ich INNER JOIN verwendet i einige der Dinge, vermisste ich zeigen wollte, weil ich alle Flüge sehen wollte und nicht nur die Flüge, die verspätet oder annulliert wurde.

Dies sind die Ergebnisse, wenn ich INNER JOIN verwendet habe, können Sie nur die Flüge sehen, die den Status "בבטטל" oder "עעככב" haben und das ist nicht das, was ich wollte.

the results with LEFT JOIN und wenn ich DISTINCT verwendet, in denen Sie die Zeilen mit der Nummer 6 auf der ersten Spalte sehen sie nur zwei Mal

WICHTIG erscheinen! Ich habe gerade meine Abfrage und alle Tabellen überprüft, die ich dort benutze, und ich habe mein Problem gesehen, weiß aber nicht, wie ich es beheben kann! in der Tabelle Irregular_Events Ich habe mehr das eine Ereignis für Flüge 3,6 und 8 und das ist, warum, wenn ich LEFT JOIN benutze, sehe ich mehr sogar, obwohl ich distinct verwende, bitte geben Sie mir etwas Hilfe!

+1

Verwenden 'SELECT DISTINCT'. –

+1

Kannst du bitte lesen? Ich schrieb, dass ich es benutzte, aber es war nicht gut. also was ist, wenn ich es nicht im Code gezeigt hatte, lesen Sie, bevor Sie das nächste Mal antworten, OK? –

+3

Eine kriegerische Haltung erhöht nicht die Wahrscheinlichkeit, dass jemand etwas gibt und beantwortet. – lit

Antwort

0

Es ist schwer zu sagen, was das Problem mit Ihrer Abfrage ohne Beispiel der Ausgabe und ohne Beschreibung der Struktur Ihrer Tabellen ist.

Aber das Problem ist, dass Ihr aus der flights Tabelle abfragen, die [Ich gehe davon aus] können irregular_events an mehrere verknüpft werden, die möglicherweise auch auf mehrere delay_event verknüpft werden können.

Wenn Sie nur eine Zeile pro Flug erhalten möchten, müssen Sie sicherstellen, dass Ihre Joins auch nur eine Zeile zurückgeben. Vielleicht können Sie es tun, indem Sie dem Join eine weitere Bedingung hinzufügen oder eine Bedingung in einer Unterabfrage hinzufügen.

EDIT

Sie könnten versuchen, eine GROUP BY auf die Abfrage hinzuzufügen:

GROUP BY 
     f.flight_code, 
     f.status, 
     a.airport_name, 
     a1.airport_name; 
+0

Flüge können mit mehreren 'irregular_events' verknüpft werden, aber' irregular_events' können mit jeweils einem 'delay_event' verknüpft werden. Mit den 'irregular_events' und dem' delay_event' kann ich feststellen, ob ein Flug annulliert oder verzögert wird und dann kann ich die tatsächliche Start- und Landezeit jedes Fluges anzeigen. aber wenn ich INNER JOIN verwende, sehe ich nur die verspäteten und annullierten Flüge und das ist nicht das, was ich wollte, also habe ich LEFT JOIN benutzt und dann habe ich an einigen Stellen 3 Duplikate –

+0

@DoronTayar meine Bearbeitung sehen. –

1

Nicht ganz sicher, ohne die Tabellenstruktur zu sehen, aber das könnte funktionieren:

SELECT f.flight_code, 
     f.status, 
     a.airport_name, 
     a1.airport_name, 
     f.departing_date+f.departing_time AS SupposedDepartingTime, 
     f.landing_date+f.landing_time AS SupposedLandingTime, 
     de.actual_takeoff_date+de.actual_takeoff_time AS ActualDepartingTime, 
     SupposedLandingTime+(ActualDepartingTime-SupposedDepartingTime) AS ActualLandingTime 
FROM 
((Flights AS f 
    LEFT JOIN Aireports AS a 
     ON a.airport_code = f.depart_ap) 
    LEFT JOIN Aireports AS a1 
     ON f.target_ap = a1.airport_code) 
    LEFT JOIN 
    (
    SELECT 
    ie.flight_code, 
    de1.actual_takeoff_date, 
    de1.actual_takeoff_time 
    FROM 
    Irregular_Events ie 
    INNER JOIN Event AS de1 
     ON ie.IE_code = de1.delay_code 
    ) AS de 
     ON f.flight_code = de.flight_code 
Verwandte Themen