2016-05-04 13 views
0

Ich mache Vergangenheit Papiere für meine Datenbank-Prüfung, und ich habe über die folgende Frage kommen:SQL COUNT Mit


Da das Schema:

  • Bahnhof (Name, Stadt) (Name ist der Schlüssel)
  • Zug (Nummer, Tag, Abflugbahnhof, Ankunftsbahnhof, Abflugzeit, Ankunftszeit) (Nummer und Tag sind ein zusammengesetzter Schlüssel und Tag in {Montag, Dienstag, ..., Sund ay}.
  • Dienst (Zugnummer, train_type, food_served, first_class) (train_number Schlüssel ist, und first_class "ja" oder "nein"

Die Abfrage ist.

finden Stationen, von denen bei mindestens 20 Züge mit erstklassigen Service Abfahrt nach Edinburgh jede Woche an Wochentagen

Meine Antwort darauf ist:.

WITH fstClass AS (
    SELECT * 
    FROM Train T, Service S 
    WHERE T.number = S.train_number AND T.arrive_station = "Edinburgh" 
    AND S.first_class = 'yes' 
    AND T.day LIKE 'S%' 
    ) 
SELECT f.depart_station 
FROM fstclass f 
GROUP by f.depart_airport 
HAVING COUNT(*) >= 20; 

Ich diskutiere mit meinem Freund, ob das richtig ist, und ich persönlich sehe nicht, was daran falsch sein könnte. Daher würde jede Einsicht, ob dies korrekt und/oder besser erscheint, sehr geschätzt. Sind temporäre Tabellen eine gute Möglichkeit, SQL-Abfragen auszuführen?

+0

Meiner Meinung nach ist jede Abfrage, die ein Komma in der 'from' Klausel automatisch falsch ist. –

+0

Was ist der Zweck der Service-Tabelle? Wie ist seine Beziehung zu 'Train'? Kann ein einzelner "Train" mehrere "Service" -Reihen haben? Was bedeutet es, wenn mehrere 'Service'-Zeilen mit den gleichen Daten für die gleiche Eltern-'Train'-Zeile vorhanden sind? – Dai

+0

@GordonLinoff Wie würdest du vorschlagen, dass ich dies anpasse? Wenn ich anstelle von 'FROM Train T, Station S'' FROM Train T JOIN-Station S ON T.number = S.train_number' verwende, ist das für dich korrekter? :) – user3186023

Antwort

1

Die Unterabfrage kann beseitigt werden, und HAVING verwendet:

SELECT 
    Trains.departingStation, 
    COUNT(*) AS numberOfTrains 
FROM 
    Trains 
    INNER JOIN Services ON Trains.number = Services.number 
WHERE 
    arrivalStation = 'Edinburgh' 
    AND 
    Services.hasFirstClassService = 1 
    AND 
    day NOT IN ('Saturday', 'Sunday') 
GROUP BY 
    departingStation 
HAVING 
    COUNT(*) >= 20 
+0

Danke dafür. Ist irgendetwas falsch mit meiner ursprünglichen Frage, die dir jedoch auffällt? – user3186023

+0

'column-alias' in der' where' Klausel? –

+1

Semantisch ist Ihre Abfrage weitgehend die gleiche wie meine, außer dass Sie die Unterabfrage mit einer 'WITH'-Klausel aliased haben (bekannt als Common Table Expression). Es funktioniert, aber es ist syntaktisch unnötig kompliziert. Vermeiden Sie auch Kommas in 'FROM'-Klauseln wie der Pest: bevorzugen Sie immer explizit' JOIN's. – Dai