Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQL Abfrage mit Joints

Dieses Thema im Forum "PostgreSQL" wurde erstellt von paul müller, 11 Dezember 2020.

  1. paul müller

    paul müller Neuer Benutzer

    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
     
  2. castorp

    castorp Datenbank-Guru

    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)
     
  3. paul müller

    paul müller Neuer Benutzer

    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?
     
  4. paul müller

    paul müller Neuer Benutzer

    Bzw. was ich meine ist ob man die Anfrage ohne Aggregationsfunktion schreibben kann ?
     
  5. castorp

    castorp Datenbank-Guru

    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));
     
    paul müller und akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden