Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

LEFT/RIGHT JOIN Fragen zur Anwendung

Begonnen von Paule, März 18, 2016, 13:07:03

⏪ vorheriges - nächstes ⏩

Paule

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

MaggieMay

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.
Freundliche Grüße
MaggieMay

Paule

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] & ('*')));


MaggieMay

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

Freundliche Grüße
MaggieMay

Paule

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.  :)