Probleme mit Abfragen

Hallo Leute,

ich hab ein paar Abfragen für eine MitarbeiterDB bei denen ich einfach auf keinen grünen Zweig komme.
Vielleicht könnt ihr mir ja weiterhelfen. Wäre echt super, mache heute seit 12 Stunden nix anderes wie DB-Abfragen und hab langsam echt ein Brett vor dem Kopf :wink:

Erst mal die DB:

mitarbeiter
mid INTEGER NOT NULL
mname VARCHAR(20) NOT NULL
chef INTEGER => REFERENCES mitarbeiter (mid)

abteilung
aid INTEGER NOT NULL
mname VARCHAR(20) NOT NULL

leitet
mid INTEGER NOT NULL => REFERENCES mitarbeiter (mid)
aid INTEGER NOT NULL => REFERENCES abteilung (aid)
von DATE NOT NULL
bis DATE

Hier die Abfragen:

  1. Welche Personen haben genau einen Untergebenen?
    Da komm ich irgendwie gar nicht drauf, hab mit da ewig verzettelt mit einem COUNT an der falschen stelle und vorbei war es.

  2. Erstellen Sie eine vollständige Übersichttabelle, die Informationen zu allen Mitarbeitern enthält: id, name, name und mid des Chefs (wenn vorhanden) sowie name und aid der Abteilung, die der Mitarbeiter DERZEIT evtl. leitet.

Mein Ansatz:
Code:
SELECT mitarbeiter.mid, mitarbeiter.mname, mitarbeiter.chef, abteilung.aid, abteilung.aname AS uebersicht
FROM mitarbeiter, leitet, abteilung
WHERE leitet.bis IS NULL AND;
Weiter komm ich aber nicht, ich hab es auch mal mit Views versucht, aber da kam auch irgendwie nix passendes raus.

  1. Geben Sie für jede Abteilung an, wie viele Leiter es dort zurzeit gibt.
    Geben Sie auch diejenigen Abteilungen aus, deren Leiterposten derzeit vakant ist.

Ich kann die Abteilungen mit der Anzahl ausgeben:
Code:
SELECT abteilung.aname, COUNT(mitarbeiter.mname)
FROM mitarbeiter, leitet, abteilung
WHERE leitet.bis IS NULL AND mitarbeiter.mid=leitet.mid AND leitet.aid=abteilung.aid
GROUP BY abteilung.aname
Und die Abteilungen die ohne Leiter sind:

Code:
SELECT abteilung.aname
FROM abteilung
WHERE abteilung.aid NOT IN
(SELECT abteilung.aid
FROM abteilung, leitet
WHERE abteilung.aid = leitet.aid
)
Aber wie ich das kombinieren kann weiß ich nicht.

  1. Gibt es in unserer Datenbank Abteilungen, die von vier oder mehr Leitern
    im Laufe der Zeit geleitet wurden? (Mich interessiert nicht, welche Abteilungen das im Einzelnen sind!) Ihre Lösung soll eine Tabelle mit genau einer Spalte und einer Zeile ausgeben, die je nach Antwort trueo der false enthält.

Überhaupt keine Ahnung …

Warum hört sich das für mich nach Hausarbeit/Studienarbeit an?

Sowas geht recht nett mit rekursiven Abfragen:

test=# select * from mitarbeiter ;
 mid | mname | chef
-----+-------+------
   1 | boss  |
   2 | chef1 |    1
   3 | chef2 |    1
   4 | ma1   |    2
   5 | ma2   |    2
   6 | ma3   |    2
   7 | ma4   |    3
(7 Zeilen)

Zeit: 0,170 ms
test=*# with recursive ma as (select * from mitarbeiter where chef is null union all select mitarbeiter.* from mitarbeiter join ma on mitarbeiter.chef=ma.mid), foo as ( select chef, count(1) from ma where chef is not null group by 1 having count(1)=1) select mitarbeiter.mid, mitarbeiter.mname from foo left join mitarbeiter on (foo.chef=mitarbeiter.mid);
 mid | mname
-----+-------
   3 | chef2
(1 Zeile)

So, den Rest Deiner Hausaufgaben bekommst Du nun sicher selber hin, damit dies:

Überhaupt keine Ahnung …

nicht so bleibt, okay?


Andreas

Danke für die Hilfe.
Es handelt sich bei den Aufgaben um Übungsaufgaben aus meinem Studium.
Ahnung hab ich schon, da waren schließlich noch 15 andere Abfragen, aber alles kann man einfach nicht wissen :wink: