Januar 20, 2021, 13:59:47

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


JOIN ON aus einer Teilmenge der "Tabelle B"

Begonnen von Jakomo, Dezember 22, 2020, 10:51:41

⏪ vorheriges - nächstes ⏩

Jakomo

Dezember 22, 2020, 10:51:41 Letzte Bearbeitung: Dezember 22, 2020, 11:02:12 von Jakomo Grund: Bild mit Beziehung eingefügt
SQL unter ACCESS. Steh auf dem Schlauch, als hätte ich zum ersten Mal SQL gesehen:

Tabelle A ist tb_Mitarbeiter
Tabelle B ist tb_VKZ (Vertriebskennziffern)
- über ID-Schlüssel in Beziehung.

Umgebung:
Nicht alle Mitarbeiter müssen in Tabelle B vorkommen
Die tb_VKZ besitzt Spalte VZ_ErfDatumZeitraum für den Tag der Erfassung (definiert fixen Zeitraum)
Zu einem bestimmten Tag müssen auch nicht alle erfasst sein. Kurz. Zum einem Stichtag, werden Vertriebskennziffern erfasst, aber eben nicht von allen Mitarbeitern.

Aufgabe:
Um Doppelerfassungen eines Mitarbeiters zu einem bestimmten Tag zu verhindern, aber vor allem(!) um die Mitarbeiter-Auswahl zu erleichtern, soll eine Combobox nur noch die Mitarbeiternamen beinhalten, die noch nicht erfasst sind, also zum "Stichtag" noch nicht in der Tabelle B sind.

Eine einfache Left Join, die alle Mitarbeiter (Tabelle A) auflistet, die noch gar nicht in den Vertriebskennzahlen (Tabelle B) vorkommen ist ja trivial, aber irgendwie muss ich es verschalten, sodass der "Left Join" nicht alle Datensätze aus Tabelle B berücksichtigt, sondern nur diejenigen für den Join heranzieht, die das selektierte Datum berücksichtigen.


Nur WIE?

Das Beispiel (ich habs extra vereinfacht):
SELECT tb_Mitarbeiter.MA_ID, tb_Mitarbeiter.MA_Name, tb_VKZ.VZ_ErfDatumZeitraum, tb_VKZ.VZ_ID
FROM tb_Mitarbeiter
LEFT JOIN tb_VKZ ON tb_Mitarbeiter.MA_ID = tb_VKZ.VZ_MA_ID
WHERE (((tb_VKZ.VZ_ID) Is Null)) OR (((tb_VKZ.VZ_ErfDatumZeitraum) ALike "16.12.2020"));

Liefert mir schonmal alle "Null" Treffer (als "Debug.print" sozusagen, lasse ich mir mit OR die Treffer zum Datum mit ausgeben)

Wie müsste der Code lauten, wenn ich nur die fehlenden Mitarbeiter im Ergebnis haben will?

Jakomo

Ich bin noch nicht ganz sicher und denke es ist auch nicht "sauber", aber so geht es offenbar:

SELECT tb_Mitarbeiter.MA_ID, tb_Mitarbeiter.MA_Name
FROM tb_Mitarbeiter LEFT JOIN tb_VKZ ON tb_Mitarbeiter.MA_ID = tb_VKZ.VZ_MA_ID
WHERE (((tb_VKZ.VZ_ID) Is Null)) OR
 (((tb_VKZ.VZ_ErfDatumZeitraum) ALike "16.12.2020")  AND ((tb_VKZ.VZ_ID) Is Null));

Kommentare erwünscht Kritik willkommen, man will ja schließlich besser werden.
Danke.

ebs17

Erst filtern, dann verknüpfen:
PARAMETERS
   parStichtag DATE
;
SELECT
   M.MA_ID,
   M.MA_Name,
   V.VZ_ErfDatumZeitraum,
   V.VZ_ID
FROM
   tb_Mitarbeiter AS M
      LEFT JOIN
         (
            SELECT
               VZ_ErfDatumZeitraum,
               VZ_ID
            FROM
               tb_VKZ
            WHERE
               VZ_ErfDatumZeitraum = [parStichtag]
         ) AS V
         ON M.MA_ID = V.VZ_MA_ID
WHERE
   V.VZ_ID Is Null
Mit freundlichem Glück Auf!

Eberhard