SQL SELECT Anfrage formulieren
-
Hallo,
ich bereite mich gerade auf meine Klausur vor. leider komme ich seit einigen Stunden nicht mehr vorran. Das liegt an einer Aufgabe in der man eine SQL Anfrage formulieren muss.2 Teilaufgaben konnte ich lösen bei der dritten, kommme ich einfach nicht auf die Lösung.
Der folgende code ist gegeben
CREATE TABLE ABTEILUNG (PKABTNR INTEGER NOT NULL, NAME VARCHAR(30) NOT NULL, BESCHREIBUNG VARCHAR(255), FKOBERABT INTEGER, PRIMARY KEY (PKABTNR), FOREIGN KEY (FKOBERABT) REFERENCES ABTEILUNG(PKABTNR)); CREATE TABLE PROJEKT (PKPRONR INTEGER NOT NULL, NAME VARCHAR(30) NOT NULL, BESCHREIBUNG VARCHAR(255), PRIMARY KEY (PKPRONR)); CREATE TABLE MITARBEITER (PKMITNR INTEGER NOT NULL, VORNAME VARCHAR(50), NACHNAME VARCHAR(50), BERUF VARCHAR(50), FKABT INTEGER, PRIMARY KEY (PKMITNR), FOREIGN KEY (FKABT) REFERENCES ABTEILUNG(PKABTNR)); CREATE TABLE PROJEKT_MITARBEITER (FKPRO INTEGER, FKMIT INTEGER, PRIMARY KEY (FKPRO,FKMIT), FOREIGN KEY (FKPRO) REFERENCES PROJEKT(PKPRONR), FOREIGN KEY (FKMIT) REFERENCES MITARBEITER(PKMITNR));
Die Frage lautet:
Geben Sie eine SQL Anweisung an, die alle Berufe der Mitarbeiter selektiert, die im gleichen Projekt wie "Cora Becks" arbeiten.Es sind nur die Tabellen gegeben und man muss alles allgemeingültig formulieren.
Hat vielleicht irgendjemand eine Idee, wie das gehen soll? Mir sind für heute auf jeden Fall die Ideen ausgegangen.Falls einer einen Vorschlag hat, bitte posten, egal wie kompliziert,
Gruss theflasher
-
SELECT DISTINCT b.BERUF
FROM PROJEKT_MITARBEITER AS a
INNER JOIN MITARBEITER AS b ON a.FKMIT=b.PKMITNR
WHERE a.FKPRO IN(
SELECT bb.PKPRONR
FROM PROJEKT_MITARBEITER AS aa
INNER JOIN PROJEKT AS bb ON aa.FKPRO=bb.PKPRONR
INNER JOIN MITARBEITER cc on aa.FKMIT=cc.PKMITNR
WHERE cc.NACHNAME='Becks' AND cc.VORNAME='Cora')
AND a.FKMIT<>(
SELECT aaa.PKMITNR
FROM MITARBEITER AS aaa
WHERE aaa.NACHNAME='Becks' AND aaa.VORNAME='Cora')
;konne die abfrage nicht testen, müsste aber soweit korrekt sein.
erklärung (damit du dem prof auch erklären kannst was du da machst :D):
im hauptteil der abfrage ermittle ich alle kombinationen von mitarbeitern und projekten die es gibt.
im ersten subselect in der where-clausel schränke ich die liste aller projekt-mitarbeiter-kombinationen auf die projekte ein, an denen auch cora becks arbeitet.
im zweiten subselect schränke ich die liste weiter ein, indem ich nur projekt-mitarbeiterkombinationen zulasse, in denen cora becks nicht vorkommt(es sollten ja alle berufe der anderen mitarbeiter ermittelt werden).
das distinct in der hauptabfrage dient dazu, eventuell mehrfach gleiche berufe zusammenzufassen, da ja mehrere mitarbeiter den selben berruf haben können.
p.s.
hat mir spass gemacht, war eine schöne aufgabe.einfachere lösung:
select distinct d.BERUF
from MITARBEITER a
inner join PROJEKT_MITARBEITER b on a.PKMITNR=b.FKMIT and a.NACHNAME='Becks' and a.Vorname='Cora'
inner join PROJEKT_MITARBEITER c on b.FKPRO=c.FKPRO and c.fkmit<>b.fkmit
inner join MITARBEITER d on c.fkmit=d.PKMITNR