Eine Fahrradwerkstatt

bluepeople12

Aktiver Benutzer
Beiträge
26
Hallo Leute,

ich hab hier eine Aufgabe und würde von euch wissen, ob mein Lösungsvorschlag dazu passt oder nicht. Hier mal die Aufgabe:

Eien Fahrradwerkstatt verwaltet ihr Sortiment an Erstatzteilen in einer relationen Datenbank (sprich: DB2). Ihre verwendetes Datenbankschema umfasst unter anderem folgende frei Relationen:
* Teil(TeilNr, Name, Gewicht, Länge, Farbe, HNr)
* besteht_aus(TeilNr, UnterteilNr, Anzahl)
* Hersteller(HNr, Name, Adresse)

Die Relation Teil enthält allgemeine Daten zu den angebotenen Teilen. In der Relation besteht_aus wird festgehalten aus welchen Unterteilen ein Ersatzteil aufgebaut ist. Hersteller umfasst Daten des Herstellers eines Ersatzteils.

Geben Sie die TeilNr und den Namen aller Teile an, an denen der Hersteller Peugeot direkt oder indirekt beteilig ist (d.h. Peugeot stellt das Teil selbst oder ein Unterteil davon her).

Mein Lösungsvorschlag (SQL-Befehl) schaut so aus:
SELECT Teil.TeilNr, Teil.Name
FROM Teil, besteht_aus, Hersteller
WHERE Teil.HNr = Hersteller.HNr AND Hersteller.Name = "Peugeot" AND (besteht_aus.TeilNr=Teil.TeilNr OR besteht_aus.UnterteilNr=Teil.TeilNr)
Würdet ihr sagen, dass sie richtig ist?
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.579
Nein, nicht ganz. Du erhältst z.B. keine Teile, die gar nicht in der besteht_aus Tabelle geführt werden weil sie keine Unterteile haben. Ich würde an deiner stelle erstmal beide Fälle seperat abbilden a) Teile des Herstellers und b) Teile, die nicht vom Hersteller sind aber Teile des Herstellers beinhalten. Ich finde das dann auch verständlicher, leichter ist sowas natürlich immer mit Testdaten, bin nicht so der Theorie Fan :)

Ein Beispiel:
Code:
SELECT    Teil.TeilNr,
        Teil.Name
FROM    Teil
-- Fall a)
-- IN kann durch = ersetzt werden, wenn es ausgeschlossen ist, das es zwei gleichnamige Hersteller gibt.
WHERE    Teil.HNr IN (    SELECT    Hersteller.HNr
                        FROM    Hersteller
                        WHERE    Hersteller.Name = "Peugeot" )
-- Fall b)
OR        Teil.TeilNr IN (    SELECT    besteht_aus.TeilNr
                            FROM    besteht_aus
                            WHERE    besteht_aus.UnterteilNr IN (    SELECT    Teil.TeilNr
                                                                    FROM    Teil
                                                                    WHERE    Teil.HNr IN (    SELECT    Hersteller.HNr
                                                                                            FROM    Hersteller
                                                                                            WHERE    Hersteller.Name = "Peugeot" )
                                                                )
                        )

Natürlich kann man das ganze auch etwas kürzen oder mit JOINs machen, deine Abfrage wird auch einige richtige Treffer liefern aber eben nicht alles. Je nach Testdaten.
 
Oben