Komplexe SQL Abfrage nicht mehreren Tabellen

viniwillswissen

Grünschnabel
Guten Tag liebe Tutorials Community,

ich studiere aktuell Informatik und wir haben als Hausarbeit folgende Aufgabe bekommen.
SQL- Aufgaben.PNG

Datenbanken.PNG
-> Ich habe folgendes Logikproblem bei der h:

SELECT SPJ.JNO
FROM J, S, SPJ
WHERE (SPJ.JNO = J.JNO) AND (SPJ.SNO = S.SNO) AND (S.CITY <> J.CITY);

-> Ausgabe beinhaltet auch die 1,4 und die 7

-> Mir fällt keine Methode ein, in der ich in der WHERE nochmal überprüfe, ob ein Projekt einmal ein 'true' bekommen hat bei
der letzten Bedingung. Damit ich diese aus der Ausgabe ausschließen kann. Auch mit einem HAVING Statement kommt mir keine Idee, wie ich das
lösen könnte. Habe es nur mit einem Counter geschafft, der die trues in einer extra Spalte zählt und diese habe ich dann mit einem Having ausgeschlossen.

Diesen Weg finde ich dennoch sehr umständlich und wollte nach eleganteren Lösungen fragen.
Wahrscheinlich übersehe ich etwas sehr simples.

Bin für jede Antwort sehr dankbar.

Mit freundlichen Grüßen

Ich
 
h) Du gibts die Projekte zurück, nicht die Teilenummer.
SQL:
select spj.pno
from spj, s, j
where
    spj.sno = s.sno
    and spj.jno = j.jno
    and j.city = s.city[/sql]
 
Du hast das Hauptkriterium falsch verstanden: Projekte in derselben Stadt wie ein Lieferant für die Teile.
Du vergleichst auf Ungleich.
Yaslaw hat das natürlich korrekt in seiner Abfrage.
Bei so einem einfachen "m:n"-Aufbau fange ich eigentlich immer hinten an:
Was ist der Vergleich, der NICHTS mit der "m:n"-Tabelle zu tun hat?
SQL:
SELECT * //Nur für Testzwecke
FROM S, J
WHERE S.City=J.City
Damit hast du alle Projekte/Lieferanten, welche in derselben Stadt sind.
Und von da hangel ich mich dann weiter, und hole den Rest ab.

btw: Les dich mal in die Thematik von JOINS ein. Ich habe früher genau wie du meine Abfragen zusammen gebaut, bin aber davon weg gegangen.
Deine (eigentlich Yaslaw's) Abfrage mit JOINS (und dann erkennst du auch, was das eigentliche Hauptkriterium ist)
SQL:
SELECT spj.pno
FROM spj
INNER JOIN j
ON
spj.jno=j.jno
INNER JOIN s
ON
spj.sno=s.sno
WHERE
s.city=j.city
Hierbei wird aber Tabelle P voll ignoriert, da die Teilenummer aus SPJ geholt wird.
Will man aber Daten aus P muss natürlich erweitert/umgebaut werden.
SQL:
SELECT SPJ.PNO, P.PNAME
FROM SPJ
INNER JOIN J
ON
SPJ.JNO=J.JNO
INNER JOIN S
ON
SPJ.SNO=S.SNO
INNER JOIN P
ON
SPJ.PNO=P.PNO
WHERE
S.CITY=J.CITY

EDIT: Dein SQL-Versuch oben im ersten Post sieht auf den ersten Blick eher nach der Lösung für Punkt i) aus......
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück