Abfrage über mehrere Tabellen

Cilenco

Benutzer
Beiträge
5
Hallo @ all

Ich habe folgendes Datenbankmodell:



Nun Möchte ich gerne folgendes Abfragen:
Alle Schüler mit eventl. Noten von einem Bestimmten Fach

Habe es schon so probiert:
Code:
SELECT S._id, S.Vname, S.Nname, S.Geb, N.Note FROM
((Schueler S LEFT JOIN Noten N ON S._id = N._idSchueler)
LEFT JOIN Pruefung P ON N._idPruefung = P._id)
WHERE P.Fach = (SELECT F._id FROM Fach F WHERE F.Name = 'Deutsch')

Leider klappt das so gar nicht. Wenn ich ein Fach angebe, in welchem noch keine Arbeiten geschrieben wurden werden mir keine Schüler angezeigt. Was habe ich falsch gemacht?

Bin für jede Hilfe dankbar. Viele Grüße
Cilenco
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.420
Nun Möchte ich gerne folgendes Abfragen:
Alle Schüler mit eventl. Noten von einem Bestimmten Fach

Habe es schon so probiert:
Code:
SELECT S._id, S.Vname, S.Nname, S.Geb, N.Note FROM
((Schueler S LEFT JOIN Noten N ON S._id = N._idSchueler)
LEFT JOIN Pruefung P ON N._idPruefung = P._id)
WHERE P.Fach = (SELECT F._id FROM Fach F WHERE F.Name = 'Deutsch')

Leider klappt das so gar nicht. Wenn ich ein Fach angebe, in welchem noch keine Arbeiten geschrieben wurden werden mir keine Schüler angezeigt. Was habe ich falsch gemacht?

Bin für jede Hilfe dankbar. Viele Grüße
Cilenco

Normal, nicht?

Wenn noch kein Schüler da eine Arbeit geschrieben hat im Fach z.B. 'datenbanken', dann kann auch keiner angezeigt werden.

Code:
test=*# select * from schueler ;
 id |   name
----+-----------
  1 | schueler1
  2 | schueler2
  3 | schueler3
(3 rows)

test=*# select * from noten ;
 note | id_schueler | id_pruefung
------+-------------+-------------
    3 |           1 |           1
    4 |           2 |           1
    5 |           1 |           2
(3 rows)

test=*# select * from pruefung ;
 id | fach
----+------
  1 |    1
  2 |    2
  3 |    3
(3 rows)

test=*# select * from fach ;
 id |    name
----+-------------
  1 | deutsch
  2 | mathe
  3 | datenbanken
(3 rows)

Wenn Du nun alles richtig zusammenjoinst, ohne WHERE, bekommst:

Code:
test=*# select s.name, s.id, f.name from schueler s left join noten n on s.id=n.id_schueler left join pruefung p on n.id_pruefung=p.id left join fach f on n.id_pruefung=f.id;
   name    | id |  name
-----------+----+---------
 schueler1 |  1 | deutsch
 schueler2 |  2 | deutsch
 schueler1 |  1 | mathe
 schueler3 |  3 |
(4 rows)

Deine Abfrage umgestellt auf 'saubere' JOIN-Syntax mit einem nicht geprüften Fach:

Code:
test=*# select s.name, s.id, f.name from schueler s left join noten n on s.id=n.id_schueler left join pruefung p on n.id_pruefung=p.id left join fach f on n.id_pruefung=f.id where f.name = 'datenbanken';
 name | id | name
------+----+------
(0 rows)

Was genau suchst Du nun?


Andreas
 

Cilenco

Benutzer
Beiträge
5
Danke schonmal dafür ja das leuchtet ein.

Also ich habe eine Klasse und ein Fach gegeben.
Nun möchte ich ALLE Schüler der Klasse ausgeben und wenn vorhanden die Noten aus dem Fach (bezogen auf den Schüler natürlich)

Nacher soll da also ca stehen
Code:
S.name    | id | Note 1  | Note 2
-----------+----+---------+--------
Christian  | 1  |    1    | 2
Johannes   | 2  |    2    | 3
David      | 3  |         |
Das da Note 1 und Note 2 nicht als einzelne Spalte steht ist mir schon klar soll es nur verdeutlichen ;)
 

akretschmer

Datenbank-Guru
Beiträge
9.420
Danke schonmal dafür ja das leuchtet ein.

Also ich habe eine Klasse und ein Fach gegeben.
Nun möchte ich ALLE Schüler der Klasse ausgeben und wenn vorhanden die Noten aus dem Fach (bezogen auf den Schüler natürlich)

Nacher soll da also ca stehen
Code:
S.name    | id | Note 1  | Note 2
-----------+----+---------+--------
Christian  | 1  |    1    | 2
Johannes  | 2  |    2    | 3
David      | 3  |        |
Das da Note 1 und Note 2 nicht als einzelne Spalte steht ist mir schon klar soll es nur verdeutlichen ;)

Das ist jetzt wieder was anderes, gell?

Du willst wissen, wie viele Noten 1, 2 ... jeder hat? Dafür gibt es Aggregatfunktionen, Du suchst was in der Art 'select name, id, note, count(1) from ... group by name,id,note'.


So, und nun übst Du mal a bissl, ja? ;-)

Andreas
 

Cilenco

Benutzer
Beiträge
5
Nein Nein Nein :D

Ich möchte einfach ALLE Schüler aus einer Klasse und ihre Noten aus einem Fach wenn sie schon Prüfungen darin geschrieben haben. Wenn nicht sollen trotzdem alle Schüler ausgegeben werden
 

akretschmer

Datenbank-Guru
Beiträge
9.420
Nein Nein Nein :D

Ich möchte einfach ALLE Schüler aus einer Klasse und ihre Noten aus einem Fach wenn sie schon Prüfungen darin geschrieben haben. Wenn nicht sollen trotzdem alle Schüler ausgegeben werden

Dann such den Unterschied, hier:

Code:
test=*# select s.name, s.id, f.name from schueler s left join noten n on s.id=n.id_schueler left join pruefung p on n.id_pruefung=p.id left join fach f on n.id_pruefung=f.id;
   name    | id |  name
-----------+----+---------
 schueler1 |  1 | deutsch
 schueler2 |  2 | deutsch
 schueler1 |  1 | mathe
 schueler3 |  3 |
(4 rows)

test=*# select s.name, s.id, f.name from schueler s left join noten n on s.id=n.id_schueler left join pruefung p on n.id_pruefung=p.id left join fach f on (n.id_pruefung=f.id and f.name='deutsch');
   name    | id |  name
-----------+----+---------
 schueler1 |  1 | deutsch
 schueler2 |  2 | deutsch
 schueler1 |  1 |
 schueler3 |  3 |
(4 rows)

Andreas
 

Cilenco

Benutzer
Beiträge
5
Also ich habe jetzt mal eine Access Datenbank vorbereitet damit du besser verstehst was ich brauche. Die Abfrage 1 soll eigentlich so sein wie sie jetzt gerade ist nur, dass bei Datensatz 5 die letzten 2 Zellen auch leer sein sollen. Wie muss ich die Abfrage bearbeiten damit das klappt?
 

Anhänge

  • Schule.zip
    19,2 KB · Aufrufe: 1

akretschmer

Datenbank-Guru
Beiträge
9.420
Also ich habe jetzt mal eine Access Datenbank vorbereitet damit du besser verstehst was ich brauche. Die Abfrage 1 soll eigentlich so sein wie sie jetzt gerade ist nur, dass bei Datensatz 5 die letzten 2 Zellen auch leer sein sollen. Wie muss ich die Abfrage bearbeiten damit das klappt?

Also ich zumindest kann Dir nicht weiter helfen: Access läuft nicht auf Linux ;-)


Andreas
 

Cilenco

Benutzer
Beiträge
5
Ich hab mal ein Bild für dich zusammengestellt ;) Das oben ist die Ausgabe und die SQL Anweisung die er mir ausspukt - ist nicht ganz so schön aber das ist halt Microsoft ;)
Bei ID 5 soll halt Englisch und die Note 5 wegfallen...
Unbenannt.jpg
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.420
Ich hab mal ein Bild für dich zusammengestellt ;) Das oben ist die Ausgabe und die SQL Anweisung die er mir ausspukt - ist nicht ganz so schön aber das ist halt Microsoft ;)
Bei ID 5 soll halt Englisch und die Note 5 wegfallen...

Ist mir zu mühsam, aus einem Bild Dinge wie Tabellenstruktur, Inhalte der Tabellen etc. zu lesen. Sorry. Verwendest Du nun MySQL oder Access oder was?
 
Oben