small-step: ACCESS XP - Einträge finden die nicht in anderer Tabelle stehen

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

  1. 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

    1. 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

      1. 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

        1. 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

          1. 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

            1. 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