2016-04-09 9 views
0

I mit folgenden Spalten auf drei Tabellen arbeiten:SQL Case-Anweisung zur Verknüpfung von Tabellen

  • Studenten (Name TEXT, courseid INTEGER, score INTEGER) zum Beispiel: ('TOM', 6120,85)
  • B. (6110, 'Science', 'LSB105')
  • gradingscheme (Buchstabe TEXT, unterer REAL, oberer REAL) zum Beispiel: ('A', 90, 100)

Ich versuche, alle drei Tabellen wie tha zu verbinden t Es enthält die für jeden Schüler in der Tabelle "Gradingscheme" angegebene Note, abhängig von der Punktzahl aus der Schülerliste. Ich benutze sqlite3 Bibliothek in Python. Ich schrieb die SQL-Anweisung wie folgt:

SELECT s.name, s.courseid, c.name, c.classroom, s.score, CASE g.letter WHEN s.score BETWEEN g.upper AND g.lower 
FROM students AS s, courses AS c, gradingscheme AS g 
WHERE s.courseid=c.courseid 

Allerdings bekomme ich einen Fehler. Die letzten beiden Zeilen des Fehlers sind wie folgt:

WHERE s.courseid = c.courseid '' ')

sqlite3.OperationalError: in der Nähe von "FROM": Syntaxfehler

Bitte helfen

bearbeitet Code:

SELECT s.name, s.courseid, c.name, c.classroom, s.score, g.letter 
FROM students AS s 
INNER JOIN courses AS c 
ON s.courseid=c.courseid 
INNER JOIN gradingscheme AS g 
ON CASE g.letter WHEN s.score BETWEEN g.lower AND g.upper 

Jetzt erhalte ich die Fehlermeldung:

EIN FALL g.letter WENN s.score zwischen unteren und oberen ‚‘ ') sqlite3.OperationalError: in der Nähe von ‚oben‘: Syntaxfehler

Möglicherweise kann ich nicht herausfinden, wie CASE-Anweisung zu verwenden, bedingt zu tun Beitritt

+0

Lernen Sie, die richtige explizite 'JOIN'-Syntax zu verwenden. Einfache Regel: * Niemals * Kommas in der FROM-Klausel verwenden. –

+0

Danke Gordon. Ich habe den Code geändert und jetzt Inner Join verwendet. Ich bekomme jedoch den Fehler, wie in der oben stehenden bearbeiteten Frage gezeigt. Ich bin möglicherweise nicht in der Lage, herauszufinden, wie man die Case-Anweisung hier verwendet. – Usman

Antwort

0

Sie brauchen nicht Ihre Abfrage mit einer Case-Anweisung verkomplizieren, können Sie Bedingung als s.score > g.lower AND s.score <= g.upper beitreten geben Sie Ihre gerade. die

SELECT s.name, s.courseid, c.name, c.classroom, s.score, g.letter 
FROM students AS s 
JOIN courses AS c 
ON s.courseid=c.courseid 
JOIN gradingscheme AS g 
ON s.score > g.lower AND s.score <= g.upper 

Hinweis weniger-als-oder-gleich-zu <= Operator auf dem oberen Bereich, denn ohne diese Menschen, die 100 Punkte erreichen überhaupt nicht gewählt werden.

Die Verwendung von BETWEEN ist gefährlich, weil es unterschiedliche Dinge in verschiedenen Datenbanken bedeutet. In sqlite umfasst BETWEEN sowohl den unteren als auch den oberen Bereich, was bedeutet, dass eine Punktzahl von 90 zwischen 80 & 90 und auch zwischen 90 & 100 ist. Sie würden Schüler mit einer Punktzahl von 90 zweimal mit beiden Noten erscheinen lassen diese Bedingung. Mithilfe von > g.lower and <= g.upper können Sie Ihr Benotungsschema als 70-80, 80-90, 90-100 sicher festlegen und sicherstellen, dass kein Konflikt/keine Überschneidung vorliegt, da Sie in Ihren Vergleichsoperatoren explizit waren.

+0

Vielen Dank für die feinen Punkte im Code. Der Ratschlag, Usman

+0

Gern geschehen! =) – daveruinseverything

0

kein Fall erforderlich - verwenden Sie einfach „und“

SELECT s.name, s.courseid, c.name, c.classroom, s.score, g.letter 
FROM students AS s 
INNER JOIN courses AS c 
ON s.courseid=c.courseid 
INNER JOIN gradingscheme AS g 
ON s.score > g.lower AND s.score < g.upper 
+0

Vielen Dank Hogan.Ich bin neu in der Codierung und wusste nicht, dass es so einfach war – Usman

+0

@Usman - yw, viel Glück! – Hogan

Verwandte Themen