SQL Abfrage

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)

Mit dieser Datenbank muss ich über 20 Anfragen erstellen. Die folgenden sind mir ein Rätsel. Hauptsächlich weil ich über mehrere Tabellen gehen muss.
Bitte kann mir jemand helfen?

  1. Angenommen Sie möchten Arthur Grumiaux oder Pinchas Zukerman spielen
    hören (als Solisten). Welche Komponisten würden Sie dann hören? Geben Sie
    Vor- und Nachnamen der Komponisten aus.

  2. Geben Sie eine Liste aller Komponisten aus (sortiert nach Name und Vorname)
    und für jeden Komponisten entweder ’Y’ falls er mindestens ein Stück mit einer
    Opus-Nummer in der Datenbank hat, oder ’N’ sonst.

    \


EMP (EMPNO, ENAME, JOB, MGR->EMP(EMPNO), HIREDATE, SAL, COMM, DEPTNO->DEPT)
PersonalNr, Name, Tätigkeit, PersonalNr des Chefs, Einstellungsdatum, Gehalt, Provision, AbteilungsNr

DEPT (DEPTNO, DNAME, LOC)
AbteilungsNr, Abteilungsname, Ort

Diese Datenbank würde mich nur aus Neugierde interessieren.

  1. Welche Angestellten (Name) sind zeitlich vor dem Chef (Angestellter, dessen
    mgr NULL ist) eingestellt worden?
    t
  2. Finden Sie alle Angestellten (Nummer, Name, Tätigkeit, Abteilungsnummer),
    die mindestens eine Person als Untergebenen haben (also die Chefs).


    Vielen Danke im Voraus

Nur der Neugierde halber,
bis wann benötigst du diese information?


Grüße

Jochen

freitag ist abgabe

hmm, und was geben wir da ab?

zu 2.) sollte etwa so funktionieren (keine Garantie!)
SELECT KOMPONIST.NAME, KOMPONIST.VORNAME FROM ((KOMPONIST INNER JOIN STUECK ON KOMPONIST.KNR = STUECK.KNR) INNER JOIN SOLIST ON STUECK.SNR = SOLIST.SNR) WHERE ((SOLIST.NAME=‘Name 1’) OR (SOLIST.NAME=‘Name 2’)) ORDER BY KOMPONIST.NAME;

Die Namen musste noch Eintragen

Müssen die Informationen in der Kategorie ‘interesiert mich nur so’ auch am freitag abgegeben werden? :wink:

Grüße

jochen

Wenn man das richtig aufdröselt, bekommt man das auch im Suff noch hin. Mal sehen, ob es nach 4 Bier noch geht:

test=*# select * from KOMPONIST;
 knr | name
-----+------
   1 | foo
   2 | bar
(2 rows)

Time: 1.758 ms
test=*# select * from STUECK;
 snr | knr |  titel
-----+-----+---------
   1 |   1 | foo-bla
   2 |   2 | bar-bla
(2 rows)

Time: 0.928 ms
test=*# select * from CD;
 cdnr | name
------+------
    1 | 1
    2 | 2
(2 rows)

Time: 0.915 ms
test=*# select * from AUFNAHME;
 cdnr | snr
------+-----
(0 rows)

Time: 1.372 ms
test=*# select * from SOLIST;
 cdnr | snr |   name   | instrument
------+-----+----------+------------
    1 |   1 | Grumiaux | Geige
    2 |   2 | Zukerman | Triangel
(2 rows)

Time: 0.912 ms
test=*# select name from KOMPONIST where knr in (select knr from STUECK where snr in (select snr from SOLIST where name in ('Grumiaux','Zukerman')));
 name
------
 bar
 foo
(2 rows)

Tabellen der Faulheit halber vereinfacht…


  1. Geben Sie eine Liste …

Zusatzpunkte:

  1. Welche Angestellten (Name) …
  2. Finden Sie alle Angestellten …


    Vielen Danke im Voraus

Das hier ist nicht die Hotline für Leute, die zu faul sind, ihre Hausaufgaben zu machen. Selber machen bringt Erfahrung.


Andreas

zu 3: Ebenfalls ohne Garantie, prüfen musste den Kram selber :wink:
SELECT KOMPONIST.NAME, KOMPONIST.VORNAME, IF (OPUSANZAHL > 0,“Y”, “N”) AS JANEINFELD FROM (SELECT KOMPONIST.NAME, KOMPONIST.VORNAME, Count(STUECK.SNR) AS OPUSANZAHL FROM (KOMPONIST INNER JOIN STUECK ON KOMPONIST.KNR = STUECK.KNR GROUP BY KOMPONIST.NAME, KOMPONIST.VORNAME, STUECK.OPUS HAVING (Not (STUECK.OPUS) Is Null))) ORDER BY KOMPONIST.NAME,KOMPONIST.VORNAME;

@andreas :slight_smile:

die table creation scripsts findest du übrigens hier:
http://dbs.informatik.uni-halle.de/Lehre/DBI06_07/cd.sql

Allerdings nicht mehr nach 4 Bier, das kann ich nachvollziehen

Grüße


Jochen