SQL Anfragen

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

SQL Anfragen
Hallo,

bin auf folgende Aufgaben gestoßen. Ich bin mir bei meinen Lösungsversuchen nicht sicher.
Vielleicht weiß ja jemand bescheid und kann mir sagen ob meine Lösungen so passen u./od.
hat eine Lösung(alternative)?

Folgende Tabellen stehen zur Verfügung:
[color=crimson]
Produktionsmaschine(MaschinenID, Bezeichnung)
Produkt(ProduktId, Produktionsmaschinen[MaschinenId])
Mitarbeiter(PersonalNr, Name, Geburtsjahr, Vorgesetzter[Mitarbeiter])
MitarbeiterArchiv(PersonalNr, Name, Geburtsjahr, Vorgesetzter[MitarbeiterArchiv])
Projekt(ProjektId, Name, Laufzeit, Leiter[Mitarbeiter])
[/color]

b) Untersucht soll, ohne Unterabfrage, die Hierarchie zwischen Mitarbeitern und Vorgesetzten:
Geben sie für die Mitarbeiter aus der Tabelle Mitarbeiter den Namen des Mitarbeiters zusammen mit dem Namen
des jeweiligen Vorgesetzten sowie den Namen dessen Vorgesetzten aus. Mitarbeiter, die keinen Vorgesetzten haben oder
deren Vorgesetzte selbst keinen Vorgesetzten haben, sollen nicht ausgegeben werden.

Mein Lösungsversuch mittels Eigenverbund:
[color=blue] SELECT m.Name AS Mitarbeiter, v.Name AS Vorgesetzter, c.Name AS Chef FROM Mitarbeiter m, Mitarbeiter v, Mitarbeiter c WHERE m.Vorgesetzter = v.PersonalNr OR v.Vorgesetzter = c.PersonalNr; [/color]

c) Überprüfen der Vollständigkeit der Tabelle MitarbeiterArchiv ohne Verbundoperation:
Die Anfrage soll herausfinden, ob alle Tupel in der Tabelle Mitarbeiter auch in der Tabelle
MitarbeiterArchiv gespeichert sind. Wenn dem so ist, soll nichts ausgegeben werden,
ansonsten soll das Ergebnis nicht leer sein.

Mein Lösungsversuch:
[color=blue] SELECT * FROM Mitarbeiter m WHERE NOT EXISTS ( SELECT * FROM MitarbeiterArchiv a, WHERE m.PersonalNr = a.PersonalNr); [/color]

d) Geben sie die Laufzeiten der bisherigen Projekte aus ohne Verbundoperation::
Die Anfrage soll die jeweiligen ProjektIds aller gespeicherten Projekte aus Projekt bis auf diejenigen
der Projekte mit der längsten gespeicherten Laufzeit ausgeben.

Mein Lösungsversuch:
[color=blue] SELECT ProjektId FROM Projekt WHERE Laufzeit <= (SELECT Max(Laufzeit) FROM Projekt); [/color]


[quote=nobody]b) Untersucht soll, ohne Unterabfrage, die Hierarchie zwischen Mitarbeitern und Vorgesetzten:
Geben sie für die Mitarbeiter aus der Tabelle Mitarbeiter den Namen des Mitarbeiters zusammen mit dem Namen
des jeweiligen Vorgesetzten sowie den Namen dessen Vorgesetzten aus. Mitarbeiter, die keinen Vorgesetzten haben oder
deren Vorgesetzte selbst keinen Vorgesetzten haben, sollen nicht ausgegeben werden.

Mein Lösungsversuch mittels Eigenverbund:
[color=blue] SELECT m.Name AS Mitarbeiter, v.Name AS Vorgesetzter, c.Name AS Chef FROM Mitarbeiter m, Mitarbeiter v, Mitarbeiter c WHERE m.Vorgesetzter = v.PersonalNr OR v.Vorgesetzter = c.PersonalNr; [/color]

c) Überprüfen der Vollständigkeit der Tabelle MitarbeiterArchiv ohne Verbundoperation:
Die Anfrage soll herausfinden, ob alle Tupel in der Tabelle Mitarbeiter auch in der Tabelle
MitarbeiterArchiv gespeichert sind. Wenn dem so ist, soll nichts ausgegeben werden,
ansonsten soll das Ergebnis nicht leer sein.

Mein Lösungsversuch:
[color=blue] SELECT * FROM Mitarbeiter m WHERE NOT EXISTS ( SELECT * FROM MitarbeiterArchiv a, WHERE m.PersonalNr = a.PersonalNr); [/color]

d) Geben sie die Laufzeiten der bisherigen Projekte aus ohne Verbundoperation::
Die Anfrage soll die jeweiligen ProjektIds aller gespeicherten Projekte aus Projekt bis auf diejenigen
der Projekte mit der längsten gespeicherten Laufzeit ausgeben.

Mein Lösungsversuch:
[color=blue] SELECT ProjektId FROM Projekt WHERE Laufzeit <= (SELECT Max(Laufzeit) FROM Projekt); [/color]
[/quote]

Wieso ein OR in der WHERE-Bedingung von der b)? Wenn ich die Aufgabe richtig verstanden habe, wäre hier ein AND sinnvoller.
c) und d) sehen gut aus, würde ich auch so machen.

PS: Hast du vielleicht ein a) vergessen, wenn du mit b) startest?


@himbeerkuchen

Bei b) war ich mir nicht sicher ob OR oder AND, da:

Die Teilaufgabe a) lautet: Die Anfrage soll, ohne Unteranfrage, die entsprechende MaschinenId
jeder Produktionsmaschine, die gespeicherten Produkte zugeordnet ist, ausgeben. Das Ergebnis
soll absteigend nach MaschinenId sortiert sein und jeden passende MaschinenId nur einmal enthalten.

Mein Lösungsvorschlag:
[color=blue] SELECT DISTINCT MaschinenId FROM Produktionsmaschinen ORDER BY MaschinenId DESC; [/color]
oder
[color=blue] SELECT MaschinenId FROM Produktionsmaschinen GROUP BY MaschinenId ORDER BY MaschinenId; [/color]


Anders gesagt (wenn ich die Aufgabe richtig verstehe): Es sollen nur Mitarbeiter ausgegeben werden, die

  1. einen Vorgesetzten haben und
  2. soll für den Vorgesetzten auch ein Chef existieren.

Bei deiner Lösung:
WHERE
m.Vorgesetzter = v.PersonalNr – prüft Bedingung 1
OR – hier wäre meiner Meinung nach ein AND korrekt
v.Vorgesetzter = c.PersonalNr – prüft Bedingung 2