Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Abfrage über zwei Tabellen





Frage

Ich habe zwei Tabellen: Training und Trainingsplan. In der Tabelle Training steht drin, wann welcher Mitarbeiter welche Trainings absolviert hat (Name, Job Function, Training, Date). Die Tabelle Trainingsplan enthält Daten dazu, welche Job Function welches Training machen muss (Job Function, Training). Diese beiden Tabellen sind nicht über Primärschlüssel verknüpft, da die relevanten Werte ja alle doppelt vorkommen. Nun möchte ich eine Abfrage machen, welcher Mitarbeiter noch welches Training braucht, aber es funktioniert nicht, weil mit Access durch den InnerJoin immer einen Mix der Tabellen auswirft. Wie kann ich das umsetzen?

Antwort 1 von disco

moin

besteht die möglichkeit die db-struktur noch zu verändern? das aktuelle schema ist wie du schon bemerkt hast ziemlicher unsinn.

du brauchst 3 tabellen:
mitarbeiter
training
train_manager

mitarbeiter und training dürften kalr sein.
in train_manager verknüpfst du die beiden über ihre schlüssel und bspw. dem datum.

g,
disco

Antwort 2 von OmaDuck

Hallo,
so geht´s


SELECT distinct Tabelle1.name, Tabelle1.jobfunction, Tabelle2.training
FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.jobfunction = Tabelle2.jobfunction
WHERE (((Tabelle2.training) Not In (select training from tabelle1 where tabelle1.jobfunction=tabelle2.jobfunction )));

Gruß
OmaDuck

Du kannst den befehl in der SQL-Ansicht eintragen. Wie ich Dir die Entwurfsansicht schicken kann, weiß ich leider nicht

Antwort 3 von SchwarzerEngel

Ich krieg gar nix mehr hin. Hab jetzt eine neue Tabelle erstellt mit den 2 Primärschlüsseln, aber bei einer Abfrage kommt natürlich nichts, da die 2 Primärschlüssel ja in keiner Verbindung zueinander stehen.

Ein Datum gibts doch auch nur in der einen Tabelle (s.o.).

Antwort 4 von SchwarzerEngel

@OmaDuck:
Danke jetzt funktionierts so halb! *freu*

Antwort 5 von SchwarzerEngel

Nun habe ich doch noch ein Problem.
Die Abfrage funktioniert einwandfrei, wenn der Mitarbeiter bisher nur ein Training absolviert hat. Wenn er jedoch schon 2 Trainings absolviert hat, zeigt die Abfrage wieder alle Trainings an, die zu absolvieren sind.

Hab ich da was falsch gemacht?

Antwort 6 von SchwarzerEngel

Also bräuchte ich eine Funktion zum umkehren der Ergebnismenge oder zum Verbinden von 2 Select-Anweisungen. Gibt es sowas?

Antwort 7 von OmaDuck

Hallo,
ganz so einfach, wie ich dachte ist die Sache doch nicht. Es sollte aber gehen, wenn Du eine Abfrage "alle_die_er_hat" erzeugst:
SELECT Tabelle1.name, Tabelle1.jobfunction, Tabelle1.training
FROM Tabelle1
WITH OWNERACCESS OPTION;
eine Abfrage "alle_die_er_soll" :
SELECT DISTINCT Tabelle1.name, Tabelle2.jobfunction, Tabelle2.training
FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.jobfunction = Tabelle2.jobfunction
ORDER BY Tabelle1.name, Tabelle2.jobfunction, Tabelle2.training
WITH OWNERACCESS OPTION;
dann hast du 2 tabellen in denen die namen und die trainings (einmal alle die er hat und einmal alle für die jobfunction notwendigen) Die kannst Du dann abfragen.
SELECT distinct alle_soll.name, alle_soll.jobfunction, alle_soll.training
FROM alle_soll LEFT JOIN alle_hat ON alle_soll.name = alle_hat.name
WHERE (((alle_soll.training) Not In (select training from alle_hat where alle_soll.name=alle_hat.name)))
ORDER BY alle_soll.name
WITH OWNERACCESS OPTION;

Gruß
OmaDuck

Antwort 8 von SchwarzerEngel

Es funktioniert!!!!!!!!
Danke danke danke!!!!!!!!!!!!!!!!!