PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfragen über zwei oder mehr Tabellen



sim4000
09.11.2006, 17:07
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.
2020

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

Wie kann man das machen?
Mfg, sim4000.

supersucker
09.11.2006, 17:34
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


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.

sim4000
09.11.2006, 21:30
select fk_klassen_id from klassen
where id not in
select distinct klassen_id from schueler;
dann kommt

you have an error in the syntax. near "select distinct klassen_id from schueler"

Haste dich vielleicht verschrieben?
Mfg, sim4000.

caba
09.11.2006, 22:00
SELECT DISTINCT(klassen_id) FROM schueler

sim4000
09.11.2006, 22:03
select fk_klassen_id from klassen where id not in SELECT DISTINCT(klassen_id) FROM schueler;

Geht immer noch nich...
Mfg, sim4000.

Peregrine
10.11.2006, 05:14
Das kommt ganz auf den SQL Dialekt an, den du nutzt.
Welche Datenbank ist da in Betrieb? Mysql, Oracle, ... ?
Kriegen wir schon hin :-)

sim4000
10.11.2006, 11:52
MySQL 5, hätte ich sagen sollen....

Mfg, sim4000.

supersucker
10.11.2006, 12:02
Ja,

hab mich verschrieben.

Mach es mal so


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.

sim4000
10.11.2006, 15:45
Supa, es funzt. Großes Dankesehr an alle.
So siehts jetzt bei mir aus:

select
fk_klassen_id as Klasse,
klassenlehrer as Klassenlehrer
from
klassen
where
fk_klassen_id not in
(select distinct(klassen_id) from schueler);
Aber eine Frage hab ich noch:
Wozu ist das distinct (siehe fette schrift)? reicht nich auch einfach klassen_id?
Mfg, sim4000.

supersucker
10.11.2006, 15:53
Das du mehrfach vorhandene Einträge nur einmal zurückgeliefert kriegst.

sim4000
10.11.2006, 16:02
aja. Wieder schlauer geworden. :)
Nochmals danke für die Hilfe.

Mfg, sim4000.

heady
10.11.2006, 18:58
sorry, aber das distinct schlüsselwort ist doch schon ein teures? ich geh mal davon aus, dass schüler niemals zweimal vorkommen oder??

sim4000
10.11.2006, 19:50
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.

heady
10.11.2006, 21:02
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...

sim4000
11.11.2006, 12:11
Noch mal gaaanz ruhig zum verständnis:
Tabelle 1: 2027
Tabelle 2: 2028

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:

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.

supersucker
11.11.2006, 12:49
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.

sim4000
11.11.2006, 12:52
Ach so.
Dann is ja gut.

Mfg, sim4000.