Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Holger69 am Dezember 23, 2021, 08:00:29

Titel: Abfrage: Beziehungen und JOINS
Beitrag von: Holger69 am Dezember 23, 2021, 08:00:29
Guten Tag Zusammen,

Folgender Fall:

Eine Abfrage soll die Feld "SampleID" aus der tblSample mit dem Feld "CompanyName" aus tblCustomer zusammenbringen. Die Beziehung der beiden Tabellen führt über zwei Zwischentabellen (tblBath bzw. tblExperiment)

Screenshot 2021-12-22 173249.png

In der tblSample gibt es immer ENTWEDER einen Fremdschlüssel zu tblBath ODER einen zu tblExperiment.

Somit kann letztlich jede SampleID immer einer CustomerID (bzw. dem Feld CompanyName) zugeordnet werden.

Jetzt meine Fragen:

Wie muss ich in dieser Konstellation die JOINS setzen, so dass die Abfrage mit dem gewünschten Ergebnis durchläuft?

Vielen Dank im Voraus fürs Nachdenken und Helfen

Weihnachtliche Grüße,
Holger
Titel: Re: Abfrage: Beziehungen und JOINS
Beitrag von: markusxy am Dezember 23, 2021, 08:56:55
Zitat von: Holger69 am Dezember 23, 2021, 08:00:29Wie muss ich in dieser Konstellation die JOINS setzen, so dass die Abfrage mit dem gewünschten Ergebnis durchläuft?


Über einen Join ist das nicht lösbar.
Ich würde wenn möglich das fehlerhafte Datenmodellkorrigieren. Das holt dich sonst immer wieder ein.

Du müsstest ja innerhalb der Abfrage prüfen,
welches der beiden Felder Daten hat und abhängig davon über verschiedene Subselect den Wert ermitteln.
Also etwa so:

(IIf(IsNull(BathID), (Select ...), (Select ...)))AS CompanyName


Titel: Re: Abfrage: Beziehungen und JOINS
Beitrag von: Holger69 am Dezember 23, 2021, 09:22:40
Vielen Dank für den Hinweis  :)

Ich habe einen Umweg mit zwei Vorabfragen und einer anschließenenden Union gefunden (vielleicht ist das ja auch gar kein Umweg, sondern die übliche Lösung bei einer solchen Aufgabe)
 
Erst zwei Abfragen die jeweils die SampleID und den Fremdschlüssel für CustomerID in tblBath bzw. tblExperiment zusammenbringen.

Screenshot 2021-12-23 090934.png

Screenshot 2021-12-23 091250.png

Und dann eine Union der beiden Felder SampleID und CompanyName

Screenshot 2021-12-23 091023.png

Das Ergebnis passt!


PS: Die Behauptung, das Datenmodell währe fehlerhaft, finde ich zu vorschnell. Zumindest ich kann an der Konstellation nichts fehlerhaftes erkennen.
Titel: Re: Abfrage: Beziehungen und JOINS
Beitrag von: ebs17 am Dezember 23, 2021, 09:41:27
Zitatdie übliche Lösung bei einer solchen Aufgabe
Das kann man so oder so werten.

Wenn sich Abfragen nur schwer erstellen lassen, insbesondere bei einer Aufgabe, die maximalst simpel ist wie das Verknüpfen von zwei Tabellen über eine weitere, dann sind Strukturprobleme sehr stark zu vermuten, selbst in Unkenntnis der Überlegungen zur Datenmodellierung.

ZitatUmweg mit zwei Vorabfragen und einer anschließenenden Union gefunden
Was willst Du veranstalten, wenn mal richtige Aufgaben kommen?
Über Performance bei evtl. größeren Datenmengen will man da gar nicht nachdenken.
Titel: Re: Abfrage: Beziehungen und JOINS
Beitrag von: markusxy am Dezember 23, 2021, 09:43:14
Zitat von: Holger69 am Dezember 23, 2021, 09:22:40Zumindest ich kann an der Konstellation nichts fehlerhaftes erkennen.

Immerhin hast du eine Lösung gefunden.
Das Fehlerhafte solltest du schon daran erkennen, welchen Kopfstand du machen musst um an die Daten zu kommen.
Aber wie auch immer, etablierte Datenmodelle kann man bekanntlich nicht so einfach ändern.
Darum schrieb ich - wenn möglich.
Titel: Re: Abfrage: Beziehungen und JOINS
Beitrag von: MzKlMu am Dezember 23, 2021, 09:59:22
Hallo,
ich sehe das Datenmodell auch eher kritisch. Auch aus der Tasache, dass eine Union notwendig ist kann man auf ein falsches Datenmodell schließen.
Und die fehlende referentielle Integrität ist auch ein Fehler. RI ist das A+O einer DB und nach dem Anlegen der Tabellen als nächsten Schritt einzustellen.

Zum Datenmodell:
Hier ist eine Tabelle notwendig die die Felder enthält die in beiden Tabellen gleich sind. Sehen tut man da nur ein Feld nämlich die CustomerID, ggf. gibt es noch weitere Felder (Datum z.B.). Der Primärschlüssel dieser Tabelle kommt dann als Fremdschlüssel in die ...Sample Tablle. Der PS dieser Tabelle kommt auch als FS in die beiden Tabellen ...Bath und ...Experiment. Zwischen der neuen Tabelle und diesen beiden Tabellen wird eine 1:1 Beziehung angelegt (FS ohne Duplikate). Die FS BathID und ExperimentID in der Sample Tabelle können dort ersatzlos gelsöcht werden.
Dann hat sich Dein Problem erledigt. Union ist auch nicht mehr notwendig.

Aber nachträglich zu ändern ist immer etwas schwierig. Aber mindestens die RI solltest Du einstellen.