SQL Abfrage mit Joints

paul müller

Neuer Benutzer
Beiträge
3
Hallo ich habe ein Problem mit meiner SQL anfragen. Ich bin noch ein ziemlicher Anfänger und gerade verwirrt
Folgende Datenbankstruktur ist gegebeben
KOMPONIST(KNR, NAME, VORNAME, GEBOREN, GESTORBEN)
STUECK(SNR, KNR->KOMPONIST, TITEL, TONART, OPUS)
CD(CDNR, NAME, HERSTELLER, ANZ CDS, GESAMTSPIELZEIT)
AUFNAHME(CDNR->CD, SNR->STUECK, ORCHESTER, LEITUNG)
SOLIST((CDNR, SNR)->AUFNAHME, NAME, INSTRUMENT)

Es sind nun alle CD´s gesucht die mehr als einen Komponisten enthalten
Von diesen soll dann der Name der CD ausgegeben werden.
Group By und Count dürfen nicht benutzt werden
Um das zu ereichen muss man ja die 4 Tabellen miteinander verbinden
Dies habe ich mir so vorgestellt:

SELECT DISTINCT cd.name
FROM komponist k LEFT join stueck s ON k.knr=s.knr
LEFT join aufnahme a ON a.snr=s.snr
LEFT join cd ON cd.cdnr=a.cdnr

Mir fehlt also noch die WHERE Bedienung
Ich muss abfragen das mehre KNR auf eine CDNR fallen.
Leider habe ich keine Ahnung wie ich das realisieren soll
 
Werbung:
Ich finde solche Aufgabenstellung bei denen die offensichtlichen und letztendlich besten Möglichkeiten nicht verwendet werden dürfen, immer ziemlich dämlich.

Aber was soll's...

Ich würde das so lösen:

Code:
select cd.cdnr, cd.name
from cd
where exists (select 1
              from aufnahme a
                join stueck st on a.snr = st.snr
              where a.cdnr = cd.cdnr
              having min(st.knr) <> max(st.knr));

Kein GROUP BY enthalten und auch kein count()

P.S.: in SQL geht's übrigens um joins - nicht um joints (die werden zum Rauchen oder Gehen verwendet)
 
Danke schonmal für die Hilfe Da hat sich wohl ein Typfehler eingeschlichen.
Das ist ja jetzt quasi mit einer Unteranfrage oder? Geht das auch irgendwie ohne Unterfrage,oder ist das die einzige Möglichkeit?
 
Werbung:
Also ohne sub-query (Unterabfrage) wird das auf keinen Fall gehen. Ganz ohne Aggregation sieht das ganz noch etwas komplexer aus:

Code:
select cd.cdnr, cd.name
from cd
where exists (select 1
              from aufnahme a1
                join stueck st1 on a1.snr = st1.snr
              where a1.cdnr = cd.cdnr
                and exists (select 1
                            from aufnahme a2              
                              join stueck st2 on a2.snr = st2.snr
                            where a2.cdnr = cd.cdnr
                              and st2.snr <> st1.snr
                              and st2.knr <> st1.knr));

Oder auch:

Code:
select cd.cdnr, cd.name
from cd
where exists (select 1
              from aufnahme a1
                join stueck st1 on a1.snr = st1.snr
              where a1.cdnr = cd.cdnr
                and st1.knr <> any (select st2.knr
                                    from aufnahme a2              
                                      join stueck st2 on a2.snr = st2.snr
                                    where a2.cdnr = cd.cdnr));
 
Zurück
Oben