Abfragen über zwei oder mehr Tabellen

sim4000

sim4000

Lebende Foren Legende
Nabend.

Ich hab heut in der Schule mal wieder SQL-Datenbanken gehabt, und schon jukt es mich wieder in den fingern.
Es handelt sich nich um Hausaufgeben. Is reine neugier.

Ich habe in einer Datenbank zwei Tabellen. Eine Tabelle beinhaltet zwei Spalten (Klassen, Klassenlehrer) und in der anderen stehen Schueler, die den verschiedenen Klassen mit einen forengekey (oder so...) zugeordnet werden.

Ich kann damit dann Abfragen welcher Schüler in welcher Klasse ist.

Nun aber meine Frage:
Ich hab noch einige Klassen erstellt, die noch keinem Schüler zugeordnet sind. Nun möchte ich abfragen und ausgeben lassen, welche Klassen noch keine schueler haben.
Geht mit "join less" hab ich gelesen... Verstehe aber nich ganz wie.
Hab die genauen Infos zur Datenbank als Anhang angehängt.
Anhang anzeigen schueler.txt

Ab
Code:
--
-- Klassen anzeigen, die nicht Schülern zugeteilt sind
--
kommen meine bisherigen versuche.

Wie kann man das machen?
Mfg, sim4000.
 
Geht viel einfacher mit subselects.

Ich hab mir dein Zeug nicht angeschaut, aber angenommen du hast eine Tabelle namens "class" mit dem Feld "id" und eine Tabelle "student" mit den Feldern "student_id" und "class_id", dann würdest du mit dieser

Code:
select id from class
 where id not in 
    select distinct class_id from student;

Abfrage alle class-ids zurückgeliefert bekommen denen noch kein schüler zugeordnet ist.
 
Code:
select fk_klassen_id from klassen 
where id not in 
select distinct klassen_id from schueler;
dann kommt
Code:
you have an error in the syntax. near "select distinct klassen_id from schueler"

Haste dich vielleicht verschrieben?
Mfg, sim4000.
 
Code:
select fk_klassen_id from klassen where id not in SELECT DISTINCT(klassen_id) FROM schueler;
Geht immer noch nich...
Mfg, sim4000.
 
Das kommt ganz auf den SQL Dialekt an, den du nutzt.
Welche Datenbank ist da in Betrieb? Mysql, Oracle, ... ?
Kriegen wir schon hin :-)
 
MySQL 5, hätte ich sagen sollen....

Mfg, sim4000.
 
Ja,

hab mich verschrieben.

Mach es mal so

Code:
select fk_klassen_id from klassen where id not in (SELECT DISTINCT(klassen_id) FROM schueler);

Das klappt bei mir.

Hatte vergessen das man, wenn man ein subselect nach "in" macht den subselect nochmal klammern muss.
 
Supa, es funzt. Großes Dankesehr an alle.
So siehts jetzt bei mir aus:
Code:
select
	fk_klassen_id as Klasse,
	klassenlehrer as Klassenlehrer
from
	klassen
where 
	fk_klassen_id not in
	(select [B]distinct(klassen_id)[/B] from schueler);
Aber eine Frage hab ich noch:
Wozu ist das distinct (siehe fette schrift)? reicht nich auch einfach klassen_id?
Mfg, sim4000.
 
Das du mehrfach vorhandene Einträge nur einmal zurückgeliefert kriegst.
 
aja. Wieder schlauer geworden. :)
Nochmals danke für die Hilfe.

Mfg, sim4000.
 
sorry, aber das distinct schlüsselwort ist doch schon ein teures? ich geh mal davon aus, dass schüler niemals zweimal vorkommen oder??
 
Eigendlich nich...
Die Schüler sind in zwei zellen aufgeteilt:
Name und Vorname.

Das Nachname oder Vorname mal doppelt vorkommen, kann schon mal vorkommen...
Mfg, sim4000.
 
ich dachte wir gehen von der id aus??

[edit] außerdem wollte ich nur sagen, dass der distinct befehl alle doppelten
aussortieren muss, und dass sich das auf die performance auswirken kann....
aber bei so kleinen schüler-klassen tablen is das egal...
 
Zuletzt bearbeitet:
Noch mal gaaanz ruhig zum verständnis:
Tabelle 1: klassen.png
Tabelle 2: schueler.png

In der einen stehen die Klassen mit samt Klassenlehrer.
In der anderen, stehen name, vorname, klasse.
Und die Klasse in beiden Tabellen werden verwendet um diese bei einer Abfrage zu verbinden. Und nun wollte ich Prüfen, welche Klassen, die ja in der Tabelle Klassen stehen, nicht in der Tabelle schueler vorkommen. Das hab ich dannn ja mit eurer Hilfe mit:
Code:
select
	fk_klassen_id as Klasse,
	klassenlehrer as Klassenlehrer
from
	klassen
where 
	fk_klassen_id not in
	(select distinct(klassen_id) from schueler);
hinbekommen. Und jeder Schüler kommt ja nur in einer Klasse vor.
Also es Funktioniert. Gibts jetzt noch irgendein Problem?

Mfg, sim4000.
 
Ne, ne,

es gibt kein Problem, das stimmt schon alles.

Wie heady schon sagte ist distinct "teuer" in dem Sinne, das die Datenbank mehr rödeln muss. Wenn man also weiss, das man eh nur unique datensätze zurückgeliefert kriegt, weil die Tabelle einfach entsprechend angelegt wurde, sollte man distinct weglassen.
 
Zurück
Oben