SQL Statement gesucht

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Tach,

bin noch relativ neu in der Datenbankprogrammierung und stehe gerade auf dem Schlauch. Ich habe 3 Tabellen Referent, Kurs, Kursveranstaltung. Dem Kurs sind Referenten und Kursveranstaltungen (die Kursabende) zugeteilt. Jetzt möchte ich gerne für einen Referenten (wird durch die RID identifiziert) von allen geleiteten Kursen (identifiziert durch KID) die 1. Kursveranstaltung (Datum) erhalten.

Mein Ansatz wäre jetzt

SELECT MIN(datum) FROM Kursveranstaltung WHERE KID IN (SELECT KID FROM Kurs WHERE RID = idDesReferenten)


Da bekomm ich aber imho (kanns grad net ausprobieren) nur das aller erste Startdatum und nicht alle zurückgeliefert ???:L . Wie schaffe ich das, dass ich eine Liste mit allen Daten bekomme, die ich benötige?

Dankö
 

The_S

Top Contributor
Könnte das so gehen?

SELECT MIN(datum) FROM Kursveranstaltung WHERE KID IN (SELECT KID FROM Kurs WHERE RID = idDesReferenten) GROUP BY KID

?
 

SamHotte

Top Contributor
Vermutlich nicht, denn mit 'group by' erzeugst du einen zusammenfassenden Datensatz und keine Liste mehr.

Dein Problem ist eher das MIN(datum) bzw. die Reihenfolge. MIN(..) erzeugt ebenso genau einen Datensatz.

Also müsstest du vielleicht erstmal 'SELECT MIN()' auf die verschiedenen Kurse anwenden, dann hast du den jeweils ersten Termin. Anschließend würde dann das 'WHERE RID=..' hinzukommen, denke ich.

edit: "jeweils" vor "ersten Termin" eingebaut
 

The_S

Top Contributor
SamHotte hat gesagt.:
Vermutlich nicht, denn mit 'group by' erzeugst du einen zusammenfassenden Datensatz und keine Liste mehr.

Mehrere Kursveranstaltungen können dieselbe KID besitzen, um zu zeigen dass sie alle einem Kurs angehören. Also versuche ich mit diesem Statement alle gleichen KIDs zusammenzufassen (GROUP BY) und dann von der Zusammenfassung jeweils den niedrigsten zu wählen.

Das Blöde ist halt dass es noch dauert bis ich das ganze Test, da ich bis jetzt weder die Möglichkeit habe Kurse noch Kursveranstaltungen anzulegen :? .

Deine Möglichkeit habsch auch schon in betracht gezogen. Aber da habsch dann wieder um die Performance angst :(
 

SamHotte

Top Contributor
Bei den Kursveranstaltungen hast du dann vermutlich einen zusammengesetzen Primärschlüssel (KID + Timestamp), richtig? Dann hilft das GROUP BY auch nicht wirklich ...

Wie viele tausend Kurse sollen denn da verwaltet werden? Bei 'nem vernünftigen DBMS ist so eine Abfrage normalerweise nicht besonders aufwendig ;)
 

Kola

Aktives Mitglied
Manche Datenbanken können keine Subselects.

Du kannst mehrere Tabellen gleichzeitig ansprechen mit
Code:
SELECT ... FROM Kursveranstaltung KV, Kurs KU WHERE ....

Dann mußt du deine Abfrage noch mit den TabellenAliases formulieren:

Code:
...WHERE KV.KID like KU.KID AND.....
 

The_S

Top Contributor
@Kola

ich glaub schon das die HSQLDB Subselects kann. Außerdem müsste ich mich dann erst in Joins einarbeiten. Kann nur den Equi-Join oder wie der heißt und der is doch recht unperformand ;)

@Sam

Nope, hab ne KVID bei der Kursveranstaltung als Primär Schlüssel. Aber selbst wenn, warum sollte es nicht gehen? ???:L

Werds mal ausprobieren, sollte es nicht gehen (sofern ichs irgendwann mal testen kann ;) )
 

foobar

Top Contributor
ich glaub schon das die HSQLDB Subselects kann. Außerdem müsste ich mich dann erst in Joins einarbeiten. Kann nur den Equi-Join oder wie der heißt und der is doch recht unperformand
Aber immer noch schneller als ein Subselect.
 

The_S

Top Contributor
Im Nachhinein hätte man sich echt die KVID sparen können und stattdessen n zusammengesetzten Primärschlüssel bauen. :oops:

Referent hat den PK RID, keinen FK
Kurs hat den PK KID, FK u. a. RID aus Referent
Kursveranstaltung hat den PK KVID, FK KID aus Kurs

[edit]
@foobar der Equi-Join ist schneller als ein Subselect? Kann ich mir eigentlich nicht vorstellen, weil Equi-Join ist ja Kreuzprodukt und somit wird in allen Tabellen nach allen Werten gesucht ???:L
 

SamHotte

Top Contributor
So ist es schön die 3. NF, passt schon von der Struktur her. Aber: wie soll das mit den KVen funktionieren? Wenn du mehrere Termine für jeden Kurs eingeben möchtest, brauchst du einen erweiterten Primärschlüssel, zum Beispiel KID + Datum.

edit: hmm, genau das sagtest du gerade ... :oops:
 

The_S

Top Contributor
Hab halt stattdessen blöderweiße noch ne ID angelegt für die jeweilige Kursveranstaltung.

Wie hilft mir das jetzt bei meinem Prob weiter?

btw: danke für die Hilfe!
 

SamHotte

Top Contributor
Naja, das MIN(datum) muss über die Menge der KVen, die zu einem R gehören, gemacht werden. Also ein Teil ist

SELECT * FROM ref, kurs
WHERE ref.RID=kurs.RID

und der zweite ist

SELECT MIN(datum) FROM [an dieser Stelle das Ergebnis der ersten Abfrage], kv
WHERE kurs.KID = kv.KID

Die Frage ist aber, wie du jetzt mehrere MIN(datum)-Einträge bekommst ... du müsstest mal probieren, ob du per GROUP BY nicht immer den ersten Eintrag bekommst, wenn du die Kursveranstaltung mit zusammengesetztem PK benutzt.

Ist ein bisschen blöd, ohne das Testen zu können (hab keine HSQLDB da).
 

The_S

Top Contributor
joa, ich schau dass ich schnell weiter komm um es bald möglichst testen zu können (denk mal bis ende der Woche dürfte ich soweit sein). Ich meld mich dann nochmal. :)
 

The_S

Top Contributor
So, bin schneller vorran gekommen als gedacht :D . Das hier

Hobbit_Im_Blutrausch hat gesagt.:
Könnte das so gehen?

SELECT MIN(datum) FROM Kursveranstaltung WHERE KID IN (SELECT KID FROM Kurs WHERE RID = idDesReferenten) GROUP BY KID

?

funktioniert einwandrei! Danke für eure Hilfe!
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben