# SQL Statement gesucht



## The_S (2. Aug 2006)

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 (2. Aug 2006)

Könnte das so gehen?

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

?


----------



## SamHotte (2. Aug 2006)

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 (2. Aug 2006)

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 (2. Aug 2006)

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 (2. Aug 2006)

Manche Datenbanken können keine Subselects.

Du kannst mehrere Tabellen gleichzeitig ansprechen mit

```
SELECT ... FROM Kursveranstaltung KV, Kurs KU WHERE ....
```

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


```
...WHERE KV.KID like KU.KID AND.....
```


----------



## The_S (2. Aug 2006)

@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  )


----------



## SamHotte (2. Aug 2006)

Dann würde mich die Datenstruktur mal interessieren - welche Relationen hast du überhaupt?


----------



## foobar (2. Aug 2006)

> 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 (2. Aug 2006)

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

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 (2. Aug 2006)

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 ... _


----------



## The_S (2. Aug 2006)

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 (2. Aug 2006)

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 (2. Aug 2006)

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.


----------



## SamHotte (2. Aug 2006)

Sag "Bescheid"


----------



## The_S (3. Aug 2006)

So, bin schneller vorran gekommen als gedacht   . 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!


----------

