2016-05-03 17 views
0

Ich studiere morgen für meine Datenbank-System-Prüfung, und ich arbeite an einer SQL-Frage. Diese Frage ist der einzige aus dem Papier, das keine Antwort haben, aber hier ist die Frage:SQL Query Ausgabe "ja"


Wir verwenden das folgende Schema:

  • Professor (Name, Büro, dept (Alter ist Schlüssel)
  • Kurs (cno, Titel, Abteilung) (cno steht für Kursnummer und ist ein Schlüssel, Titel ist der Name des Kurses und Abteilung ist Name der Abteilung, die den Kurs anbietet)
  • Enrollment (CNO, Semester, inst_name, Einschreibung) (der Schlüssel dafür ist, (CNO, Semester)

Frage: Schreiben Sie die folgende SQL-Abfrage: Ausgabe eine Tabelle, die die einzelne Zeile "Ja" enthält, in es, wenn der Altersunterschied zwischen den ältesten und den jüngsten Professoren der Datenbanksysteme Kurs zwischen 2000 und 2009 Unterricht ist höchstens 5 Jahre


ich amn't sicher, dass mein Ansatz richtig ist, da wir nicht genau das tun, möchte etwas aus der Tabelle ausgeben. Beachten Sie, dass ich glaube, dass die Einschreibung dem Zeitpunkt entspricht, zu dem der Ausbilder mit dem Kurs begonnen hat (was nicht die übliche Definition AFAIK ist).

Mein Ansatz ist wie folgt:

WITH dbsProfs AS (
    SELECT P.age 
    FROM Professor P, Enroll E, Course C 
    WHERE P.name = E.inst_name AND C.cno = E.cno AND C.title = "Database Systems" 
     AND E.enrollment BETWEEN 2000 and 2009 
    ) 
SELECT "Yes" 
FROM dbsProfs 
WHERE MAX(dbsProfs.age) - MIN(dbsProfs.age) <= 5 

Ich bin ziemlich zuversichtlich, mit meiner temporären Tabelle. Ich mache einen Join an allen 3 Tabellen und filtere nur diejenigen heraus, die für meine Abfrage relevant sind. Es ist die andere Hälfte, über die ich mir nicht sicher bin.

Jeder Einblick darauf, ob dies richtig ist/wie dies zu korrigieren ist, würde sehr geschätzt werden. Ich amn't überzeugt WHERE MAX(dbsProfs.age) - MIN(dbsProfs.age) <= 5 gilt SQL

+1

Post die Frage ist, wird die Seite für einige von uns gesperrt. – sagi

+0

@sagi Ich entschuldige mich. Der Beitrag wurde aktualisiert – user3186023

Antwort

3

Mit Aggregatfunktion shoud Sie verwenden

SELECT "Yes" 
FROM dbsProfs 
HAVING MAX(dbsProfs.age) - MIN(dbsProfs.age) <= 5 
+0

Warum zur Hölle hat 'HAVING' meinen Verstand verlassen ???? Ich habe es für die letzten 3 Fragen benutzt, Gott verdammt. Wird dies nichts zurückgeben (leere Tabelle), wenn diese Bedingung nicht erfüllt ist? Danke vielmals :) – user3186023

1
WITH dbsProfs AS (
    SELECT MIN(P.age) as min_age,MAX(P.age) as max_age 
    FROM Professor P, Enroll E, Course C 
    WHERE P.name = E.inst_name AND C.cno = E.cno AND C.title = "Database Systems" 
     AND E.enrollment BETWEEN 2000 and 2009 
    ) 
SELECT CASE WHEN min_age<max_age THEN "Yes" END 
FROM dbsProfs 
+0

Das ist interessant, ich habe noch nie die 'WHEN ... THEN ... END' Anweisungen in einer Abfrage verwendet. Ich nehme an, sie nennen dies eine Anfänger-Datenbank-System-Klasse aus einem Grund :). Gibt es überhaupt eine Möglichkeit, es mit 'WHERE' zu repräsentieren oder ist das einfach nicht möglich? Danke für diesen Vorschlag :) – user3186023

+1

Ich nehme zurück, was ich gesagt habe. Ich habe Fälle nur einmal benutzt, aber mir ist es immer noch entfallen.Das ist ein toller Weg, danke :) – user3186023

-1

Es ist wahr, Sie nicht Aggregatfunktionen in Ihrer WHERE-Anweisung setzen. Diese Frage wird ein bisschen mehr Arbeit erfordern. Dies setzt voraus, Einschreibung ist in der Tat das Jahr der Kurs angewiesen wurde (wie man auch angenommen)

SELECT CASE WHEN A.MaxAge - A.MinAge <=5 THEN "Yes" END 
    FROM 
    (
     SELECT Max(Professor.age) AS MaxAge, Min(Professor.age) AS MinAge 
     FROM Professor INNER JOIN Enroll ON Professor.name = Enroll.inst_name 
     INNER JOIN Course ON Enroll.cno = Course.cno 
     WHERE Course.title = "Database Systems" AND Enroll.enrollment BETWEEN 2000 AND 2009 
    ) AS A 

:

Dies ist der Ansatz, den ich nehmen würde. Sie können eine iif-Anweisung verwenden, wenn Sie SQL Server anstelle von SELECT CASE bevorzugen (letzteres ist mehr t-SQL-Standards freundlich).