ACCESS XP - Einträge finden die nicht in anderer Tabelle stehen
small-step
- datenbank
Hallo alle,
ich habe hier ein kleines Problem mit Access XP. Wie so oft... Hoffentlich kann mir heute jemand antworten :)
Ich habe eine Datenbank mit mehreren Tabellen. Jetzt möchte ich eine Benutzerauswahl machen, in der ich auf der linken Seite die bereits ausgewählten Nutzer aufgelistet habe, und auf der rechten Seite die restlichen Mitarbeiter. Jetzt will ich natürlich, dass auf der rechten Seite nur Mitarbeiter gelistet werden, die in der linken Auflistung noch nicht vorkommen. Wäre ja auch Blödsinn.
Ich komm einfach nicht drauf, wie ich das SQL-Statement formulieren muss. Ansätze habe ich einige, ob sie wirklich in die richtige Richtung gehen... keine Ahnung.
Das hier wäre so ein Ansatz. Ich bin mir außerdem nicht wirklich sicher, ob Access überhaupt Subselects unterstützt.
SELECT PKMitarbeiter,Vorname,Nachname
FROM tbMitarbeiter
WHERE PKMitarbeiter NOT IN(SELECT FKMitarbeiter FROM tbProjektliste)
Ich hoffe ihr könnt mir helfen.
Gruß,
small-step
Hallo,
Ich bin mir außerdem nicht wirklich sicher, ob Access überhaupt Subselects unterstützt.
Tut es.
SELECT PKMitarbeiter,Vorname,Nachname
FROM tbMitarbeiter
WHERE PKMitarbeiter NOT IN(SELECT FKMitarbeiter FROM tbProjektliste)
Das sollte so funktionieren, wenn PKMitarbeiter und FKMitarbeiter Felder identischen Typs sind. Das Ergebnis enthält dann alle Datensätze aus tbMitarbeiter, deren Wert im Feld PKMitarbeiter keine Entsprechung im FKMitarbeiter-Feld der Tabelle tbProjektliste hat.
viele Grüße
Axel
Hallo Axel Richter,
Das sollte so funktionieren, wenn PKMitarbeiter und FKMitarbeiter Felder identischen Typs sind. Das Ergebnis enthält dann alle Datensätze aus tbMitarbeiter, deren Wert im Feld PKMitarbeiter keine Entsprechung im FKMitarbeiter-Feld der Tabelle tbProjektliste hat.
Wie peinlich, ich hab vergessen zu sagen, was denn nicht funktioniert...
Das Ergebnis der Abfrage ist leer.
Gruß,
small-step
Hallo,
Wie peinlich, ich hab vergessen zu sagen, was denn nicht funktioniert...
Das Ergebnis der Abfrage ist leer.
Können die Felder PKMitarbeiter und/oder FKMitarbeiter den Wert NULL enthalten? Wenn ja, warum sind es keine Primärschlüssel?
Die Operationen NULL IN (1,2,3,4) bzw. 1 In (NULL,1,2,3) sind nicht definiert, da der Typ von NULL nicht dem Typ von 1 (Zahl) entspricht.
SELECT PKMitarbeiter,Vorname,Nachname
FROM tbMitarbeiter
WHERE PKMitarbeiter NOT IN (SELECT FKMitarbeiter FROM tbProjektliste WHERE FKMitarbeiter IS Not NULL)
oder
SELECT PKMitarbeiter,Vorname,Nachname
FROM tbMitarbeiter
WHERE PKMitarbeiter NOT IN (SELECT FKMitarbeiter FROM tbProjektliste WHERE FKMitarbeiter IS Not NULL) OR PKMitarbeiter Is NULL
Besser wäre aber, NULL-Werte in diesen Feldern zu verhindern.
viele Grüße
Axel
Hallo,
Können die Felder PKMitarbeiter und/oder FKMitarbeiter den Wert NULL enthalten? Wenn ja, warum sind es keine Primärschlüssel?
PKMitarbeiter ist Primärschlüssel der Tabelle tbMitarbeiter, FKMitarbeiter ist genau dieser Schlüssel, allerdings als Fremdschlüssel in der Tabelle tbProjektliste. Sie können also beide nicht NULL enthalten.
Gruß,
small-step
Hallo,
PKMitarbeiter ist Primärschlüssel der Tabelle tbMitarbeiter, FKMitarbeiter ist genau dieser Schlüssel, allerdings als Fremdschlüssel in der Tabelle tbProjektliste. Sie können also beide nicht NULL enthalten.
Dann kann
SELECT PKMitarbeiter,Vorname,Nachname
FROM tbMitarbeiter
WHERE PKMitarbeiter NOT IN (SELECT FKMitarbeiter FROM tbProjektliste)
nur eine leere Datensatzmenge zurückliefern, wenn _alle_ Datensätze aus tbMitarbeiter eine Entsprechung in tbProjektliste über PKMitarbeiter=FKMitarbeiter haben oder tbMitarbeiter leer ist.
Was ergibt:
SELECT PKMitarbeiter,Vorname,Nachname
FROM tbMitarbeiter
und was ergibt:
SELECT PKMitarbeiter,Vorname,Nachname
FROM tbMitarbeiter
WHERE PKMitarbeiter IN (SELECT FKMitarbeiter FROM tbProjektliste)
oder
SELECT tbMitarbeiter.PKMitarbeiter, tbProjektliste.FKMitarbeiter
FROM tbMitarbeiter INNER JOIN tbProjektliste ON tbMitarbeiter.PKMitarbeiter = tbProjektliste.FKMitarbeiter;
?
viele Grüße
Axel
Hallo,
... nur eine leere Datensatzmenge zurückliefern, wenn _alle_ Datensätze aus tbMitarbeiter eine Entsprechung in tbProjektliste über PKMitarbeiter=FKMitarbeiter haben oder tbMitarbeiter leer ist.
Ich bin ein Idiot...
SELECT PKMitarbeiter,Vorname,Nachname
FROM tbMitarbeiter
WHERE PKMitarbeiter NOT IN
(SELECT FKMitarbeiter
FROM tbProjektliste
WHERE FKProjekt = " & cboProjektliste & ")
Jetzt funktioniert es. Wenn man schon eine Einschränkung macht, sollte man darauf achten, sie auch anzugeben...
Ich schäme mich...
Vielen Dank für die Hilfe!
Gruß,
small-step