2016-09-07 5 views
0

Ich habe in den letzten paar Stunden meinen Kopf gegen die Wand geschlagen (peinlich, ich weiß), aber ich kann einfach nicht scheinen, diese Abfrage zu arbeiten! Ich habe mir ähnliche Fragen angeschaut, ein paar Tutorials auf Youtube gesehen, aber aus welchen Gründen auch immer kann ich meinen Code nicht zum Laufen bringen. Also, ach hier bin ich:SQL Query mit mehreren Tabellen Joins

Die Abfrage soll drei Dinge zurückgeben: DEPT (Abteilung), CNUM (Kursnummer) & CTITLE (Kurs Titel) eines Studenten ID, die Kurse während eines bestimmten Semesters nahm.

Zum Beispiel, ich versuche, meine Frage zu bekommen den Kurs Abteilung, Titel und die Nummer einer Person zu erklären, die ID ist 101 und nahm Kurse im Frühjahr 2013 ist unter meinem Code:

set echo on 

spool c:\is\program1.txt 

SELECT Courses.DEPT, Courses.CNUM, Courses.CTITLE 
FROM Students 
    INNER JOIN Enrollments 
     ON Students.SNUM = Enrollments.SNUM 
    INNER JOIN SchClasses 
     ON Enrollments.CallNum = SchClasses.Callnum 
    INNER JOIN Courses 
     ON SchClasses.CNUM = Courses.CNUM 
AND Students.SNUM = '101' 
AND SchClasses.Semester = 'Sp' 
AND SchClasses.Year = '2013'; 

spool off 

Meine Tabellendaten ist wie folgt: enter image description here

Die folgende Abfrage zurückgibt: keine Zeilen ausgewählt

ich nicht für jemanden, freue mich auf meine zu tun Arbeit für mich, ich suche nur nach einem Punkt in die richtige Richtung. Jeder Rat würde sehr geschätzt werden, danke nett!


ich dieses Problem mit Hilfe von Ihnen gelöst haben alle, ich danke Ihnen sehr. Es stellt sich heraus, dass ich logisch darüber nachgedacht habe - es wurden tatsächlich keine Werte in den Spring-Datensatz eingefügt und somit ist das Ergebnis, dass keine Zeilen gefunden wurden, korrekt!

Es war so eine einfache Aufsicht, aber ich habe es herausgefunden. Danke euch allen; Die richtige Lösung bleibt wie folgt:

set echo on 

spool c:\is\program1.txt 

SELECT Courses.DEPT, Courses.CNUM, Courses.CTITLE 
FROM Students 
    INNER JOIN Enrollments 
     ON Students.SNUM = Enrollments.SNUM 
    INNER JOIN SchClasses 
     ON Enrollments.CallNum = SchClasses.Callnum 
    INNER JOIN Courses 
     ON SchClasses.CNUM = Courses.CNUM 
AND Students.SNUM = '101' 
AND SchClasses.Semester = 'Sp' 
AND SchClasses.Year = '2013'; 

spool off 
+2

Gibt es einen Grund, warum Sie alle Ihre Bedingungen auf die Join-Anweisungen anstatt auf eine WHERE-Klausel anwenden? Wenn es keinen bestimmten Grund dafür gibt, fehlt wahrscheinlich eine WHERE-Klausel. – PhillipXT

+0

Hallo Phillip. Vor allem kein Grund, ich sah gerade ein ähnliches Problem auf diese Weise und ich hoffte auf positive Ergebnisse. Ein vorheriges Poster hat mir auch empfohlen, die erste Bedingung in "where" zu ändern, es wird jedoch das gleiche Ergebnis zurückgegeben: keine Zeilen ausgewählt. – Lukon

+0

Sie stellen zwei zusätzliche Tabellen in Ihrem Schema bereit, sie werden jedoch nicht in Ihrer Abfrage angezeigt. Wie auch immer, ich würde vermuten, dass Ihre Anfrage ein einziges Ergebnis liefert - Intro zu MIS. Bist du vielleicht bei 'PreReq' dabei, wo' cnum' 300 nicht existiert? – sgeddes

Antwort

1
set echo on 

spool c:\is\program1.txt 

SELECT * 
FROM Students 
    INNER JOIN Enrollments 
     ON Students.SNUM = Enrollments.SNUM AND Students.SNUM = '101' 
    --INNER JOIN SchClasses 
    -- ON Enrollments.CallNum = SchClasses.Callnum AND SchClasses.Semester 'Sp' AND SchClasses.Year = '2013'; 
    -- INNER JOIN Courses  ON SchClasses.CNUM = Courses.CNUM 

diese Abfrage ausführen. Wenn Sie Ergebnisse erhalten, entfernen Sie den Kommentar für den nächsten inneren Join. Wenn Sie keine Ergebnisse erhalten, überprüfen Sie, warum Ihre Bedingungen nicht erfüllt sind. Wenn Sie das Ergebnis erhalten, kommentieren Sie den nächsten Join. Ich hoffe es hilft.

+0

habe ich versucht, so etwas wie dies früher, logisch es macht Sinn für mich, aber aus irgendeinem Grunde die Abfrage den gleichen Wert zurückzugibt: keine Zeilen ausgewählt er die Code Pausen @ die zweiten inneren Verknüpfung erscheint: SELECT * VON Students \t INNER JOIN Einschreibungen \t \t ON Students.SNUM = Enrollments.SNUM Students.SNUM UND = '101' \t INNER SchClasses \t \t ON Enrollments.CallNum = SchClasses.CallNum \t \t \t UND SchClasses.Semester JOIN = ' Sp ' \t \t \t UND SchClasses.Year =' 2013 '; \t spool off – Lukon

+0

Starten Sie mit einer Bedingung in diesem bestimmten Join und sehen, wenn es aufhört, Sie geben Ergebnis, dh es gibt 3 Bedingungen in diesem Join fügen Sie eins nach dem anderen und überprüfen Sie die Ergebnisse .. – Nagahornbill

+0

Sieht nicht wie der zweite Join ist die richtigen Ergebnisse geben.Wenn man sich die Ergebnisse ansieht, gibt es nur zwei Rekorde. Und sie sind beide für Andy für das Herbstsemester, sollte man nicht wenigstens Spring sein? Ich verstehe nicht, wie dieses Ergebnis von dem Code abgefragt wird. – Lukon

0

Die Where-Anweisung fehlt. Sie sollten Where anstelle des ersten und schreiben.

+0

Hmm, ich habe gerade meine erste Bedingung auf 'where' aktualisiert und es wurde dieselbe Abfrage zurückgegeben: keine Zeilen ausgewählt. – Lukon

+0

Mit 'inner join' sind sie gleichwertig: http://stackoverflow.com/a/354095/1073631 – sgeddes

1

Konnte keine Probleme mit Ihrer Abfrage auf den ersten Blick finden.

Wenn die Spalten SNUM und Year als Zeichenfolge gespeichert werden, besteht die Möglichkeit, dass Platzprobleme auf der linken oder rechten Seite der Zeichenfolge auftreten. Sie können die Spalte trimmen und es erneut versuchen.

SELECT Students.SNUM ,Enrollments.SNUM ,Enrollments.CallNum ,SchClasses .CallNum 
    FROM Students 
    INNER JOIN Enrollments 
     ON Students.SNUM = Enrollments.SNUM 
      AND Students.SNUM = '101' 
    LEFT JOIN SchClasses 
     ON LTRIM(RTRIM(Enrollments.CallNum)) = LTRIM(RTRIM(SchClasses.CallNum)) 
      --AND LTRIM (RTRIM (schClasses.Semester)='sp' 
      --AND LTRIM (RTRIM(schClasses.Year))='2013' 
+0

Danke für den Vorschlag, aber das hat nichts anderes zurückgegeben. Gleiches Ergebnis: keine Zeilen ausgewählt. – Lukon

+0

Ändern Sie Ihre innere Verbindung mit linken Join und versuchen Sie es erneut .. Und lassen Sie mich wissen, das Ergebnis, das Sie erhalten –

+0

Ich würde auch vorschlagen, die AND-Klauseln am Ende für jetzt entfernen, um zu sehen, ob das Problem mit den Joins oder mit ist der bestimmte Datensatz – kbball