Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Paule am März 18, 2016, 13:07:03

Titel: LEFT/RIGHT JOIN Fragen zur Anwendung
Beitrag von: Paule am März 18, 2016, 13:07:03
Hallo,

ich habe mal wieder ein Anliegen bezüglich der JOIN-Anweisungen.

Ich habe anbei folgenden SQL-Code einer Abfrage:
SELECT MI_Regions.RegionName, MI_Districts.DistrictName, MI_Wards.WardName, MI_Villages.VillageName, MI_Villages.Population, MI_Villages.Electricity, MI_Villages.IncomeType, MI_Villages.Products, MI_Villages.HarvestPeriod, MI_Villages.IncomePeriod
FROM ((MI_Regions INNER JOIN MI_Districts ON MI_Regions.RegionName = MI_Districts.RegionName) INNER JOIN MI_Wards ON MI_Districts.DistrictName = MI_Wards.DistrictName) INNER JOIN MI_Villages ON MI_Wards.WardID = MI_Villages.WardID;


Dort sehe ich dann jede Region (aus MI_Region), alle Districts (aus MI_Districts) innerhalb dieser Regionen, alle "Wards" (aus MI_Ward) innerhalb der Districts und alle Villages (MI_Villages) innerhalb der "Wards" sowie einige weitere Informationen zu den Dörfern (aus MI_Villages).

So weit so gut und alles wie gewünscht.

Nun habe ich eine weitere Tabelle mit Kontaktpersonen aus jedem Village.

Ich möchte meine Abfrage nun insofern erweitern, dass er mir alles wie eben weiter anzeigt und zusätzlich dann dazu alle Kontaktpersonen aus jeglicher Region daneben anzeigt.

In der Tabelle MI_Contacts sind auch die Felder Region, District, Ward, Village gespeichert.

Ich dachte nun daran, für die Abfrage die Felder MI_Contacts.Village und MI_Villages.VillageName zu verknüpfen (gleiche Datentypen und Information) und wollte dies so tun, dass alle Datensätze aus MI_Contacts enthalten sind und nur die Datensätze aus MI_Villages wo die eben genannten Felder gleich sind. Und mir darauf mal ein Feld aus MI_Contacts mit anzuzeigen (zusätzlich zu den bestehenden, siehe Quellcode).

Nun kommt als Fehlermeldung, dass mehrdeutige äußere Verknüpfungen bestehen, und ich müsste erst separate Abfragen erstellen...

Ist dem so, oder liegt bei mir nur ein Denkfehler vor und man könnte sehr wohl alles in einer ABfrage zusammenführen wie gewünscht?

Ich wäre euch sehr dankbar für eure Hilfe,
Marcus
Titel: Re: LEFT/RIGHT JOIN Fragen zur Anwendung
Beitrag von: MaggieMay am März 18, 2016, 13:27:37
Hallo Marcus,
ZitatIn der Tabelle MI_Contacts sind auch die Felder Region, District, Ward, Village gespeichert.
wozu das, der Bezug zum Village sollte doch genügen.

Wenn du versuchst, die Tabelle per "Outer Join" mit drei anderen zu verknüpfen, die in Abhängigkeit zueinander stehen, kann das wohl nur schief gehen.
Titel: Re: LEFT/RIGHT JOIN Fragen zur Anwendung
Beitrag von: Paule am März 18, 2016, 13:52:42
Alles klar. Ja, stimmt. Ich hatte diesen Teil der Datenbank zwar nicht gemacht, aber ich hab ehrlichweise auch nicht daran gedacht, die überflüssigen Felder zu entfernen.
Gesagt getan, in der Tabelle MI_Contacts ist jetzt nur noch das Village gespeichert.

Dieses Feld habe ich mit MI_Village.VillageName in Beziehung gesetzt (MI_Village.VillageName ist aber kein PK, sondern MI_Village.VillageID).

Nun habe ich in der Abfrage oben beschriebenes erneut versucht, habe dabei wieder angegeben, dass er mir alle Datensätze aus MI_Contacts zeigen soll und diejenige von MI_Villages bei denen die verknüpften Daten (Village//VillageName) gleich sind.

Aber ich habe weiterhin dieselbe Fehlermeldung.

SQL-COde ist jetzt:

SELECT MI_Regions.RegionName, MI_Districts.DistrictName, MI_Wards.WardName, MI_Villages.VillageName, MI_Villages.Population, MI_Villages.Electricity, MI_Villages.IncomeType, MI_Villages.Products, MI_Villages.HarvestPeriod, MI_Villages.IncomePeriod, MI_Contacts.ContactName
FROM MI_Contacts LEFT JOIN ((MI_Regions INNER JOIN (MI_Districts INNER JOIN MI_Wards ON MI_Districts.DistrictName = MI_Wards.DistrictName) ON MI_Regions.RegionName = MI_Districts.RegionName) INNER JOIN MI_Villages ON MI_Wards.WardID = MI_Villages.WardID) ON MI_Contacts.Village = MI_Villages.VillageName
WHERE (((MI_Regions.RegionName) Like [TempVar]![RegionVO] & ('*')) AND ((MI_Districts.DistrictName) Like [TempVar]![DistrictVO] & ('*')));

Titel: Re: LEFT/RIGHT JOIN Fragen zur Anwendung
Beitrag von: MaggieMay am März 18, 2016, 15:38:43
Verknüpfungen sollten stets über die ID vorgenommen werden.
Warum hast du denn in der Kontakttabelle den Namen gespeichert?

Davon abgesehen halte ich die Verknüpfungen für falsch.
Wenn du die Kontakte zur obigen Abfrage hinzufügen willst, dann so:
Select ...
FROM (((MI_Regions INNER JOIN MI_Districts ON MI_Regions.RegionName = MI_Districts.RegionName) INNER JOIN MI_Wards ON MI_Districts.DistrictName = MI_Wards.DistrictName) INNER JOIN MI_Villages ON MI_Wards.WardID = MI_Villages.WardID) LEFT JOIN MI_Contacts ON MI_Contacts.Village = MI_Villages.VillageName

Titel: Re: LEFT/RIGHT JOIN Fragen zur Anwendung
Beitrag von: Paule am März 18, 2016, 16:29:59
Ja, wie gesagt, ich hatte diesen Teil der Datenbank nicht erstellt. Aber ich habe es nun korrigiert und über die ID verknüpft.

Und vielen Dank für den Code. Es funktioniert nun super und ich konnte alle meine gewünschten Felder hinzufügen.  :)