Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

m:n-Beziehung: Anzeige aller Datenstze, die mit bestimmten Daten verknpft sind

m:n-Beziehungen sind manchmal etwas strrisch, wenn man bestimmte Informationen aus ihnen herausholen mchte. Im vorliegenden Fall handelt es sich um Autos und Fahrer, bei dem jeder Fahrer jedem Auto zugeordnet werden kann. Es soll herausgefunden werden, welche Fahrer mit bestimmten Autos fahren.

Beispieldatenbank

Die Beispieldatenbank enthlt die beiden Tabellen tblAutos und tblFahrer sowie die Verknpfungstabelle tblFahrerAutos. Auerdem finden Sie in der Datenbank das Formular frmMN, mit dem die Autos ausgewhlt werden knnen, deren Fahrer zu ermitteln sind.

Beschreibung der zugrundeliegenden Abfrage

Um die gewnschte Information zu erhalten, ist eine etwas knifflige Abfrage erforderlich. Folgende Abfrage ermittelt beispielsweise alle Fahrer, die dem Fahrzeug 1 zugeordnet sind:

SELECT FahrerID, Fahrer FROM tblFahrer WHERE FahrerID IN (SELECT FahrerID FROM tblFahrerAutos WHERE  AutoID = 1 GROUP BY FahrerID HAVING Sum(1)>=1)

Der erste Teil der Abfrage ohne die Where-Bedingung gibt einfach alle FahrerIDs und Fahrer zurck. Interessant ist die Bedingung: Dabei handelt es sich um eine Unterabfrage, die alle FahrerIDs aus der Tabelle tblFahrerAutos zurckgibt, bei denen die AutoID 1 ist. Auerdem ist die Abfrage nach der FahrerID gruppiert und enthlt die Anzahl der Datenstze je Fahrer.

Diese Anzahl ist im Falle eines einzigen ausgewhlten Autos noch nicht relevant. Sie wird erst bei zwei und mehr Autos interessant. Die folgende Abfrage ermittelt alle Fahrer, die den Autos mit der AutoID 1, 2 oder 3 zugeordnet sind:

SELECT FahrerID, Fahrer FROM tblFahrer WHERE FahrerID IN (SELECT FahrerID FROM tblFahrerAutos WHERE  AutoID = 1 OR AutoID = 2 OR AutoID = 3 GROUP BY FahrerID HAVING Sum(1)>=3)

Diese etwas merkwrdig anmutende Abfrage hat ihren Sinn darin, dass man aus einer m:n-Abfrage nur schlecht Datenstze finden kann, die mehreren Kriterien gleichzeitig entsprechen, die also per Und verknpft sind.

Daher wird hier eine Oder-Verknpfung gewhlt. Das reicht natrlich nicht aus, denn bei einer Oder-Verknpfung knnen auch Fahrer ermittelt werden, die nur mit einem Auto-Datensatz verknpft sind. Also wird noch gezhlt, wie oft der Fahrer in der Gruppierung vorkommt.

Formular zur Auswahl von Autos und Anzeige verknpfter Fahrer

Leider ist der Aufbau der Abfrage dynamisch und kann nicht einfach mit Parametern gefllt werden, so dass die Abfrage an die jeweils aktuelle Anforderung angepasst werden muss.

Die Beispieldatenbank enthlt ein Formular, mit dem Sie die Autos auswhlen knnen, zu denen alle verknpften Fahrer angezeigt werden sollen (siehe Abbildung 1).

Abbildung 1: Auswahl von Autos und Anzeige der verknpften Fahrer

Die Eigenschaft Mehrfachauswahl des Listenfeldes lstAutos ist auf Einfach eingestellt. Fr die Ereigniseigenschaft Nach Aktualisierung hinterlegen Sie die folgende Prozedur:

Private Sub lstAutos_AfterUpdate()

    Dim Anzahl As Integer

    Dim Element As Variant

    Dim strBedingung As String

    For Each Element In Me.lstAutos.ItemsSelected

        Debug.Print Element

        strBedingung = strBedingung & " OR AutoID = " _

            & Me.lstAutos.ItemData(Element)

        Anzahl = Anzahl + 1

    Next Element

    If Len(strBedingung) > 0 Then

        strBedingung = Mid(strBedingung, 4)

    End If

    strSQL = "SELECT FahrerID, Fahrer FROM tblFahrer"

    If Not Anzahl = 0 Then

        strSQL = strSQL & " WHERE FahrerID IN (SELECT FahrerID " _

            & "FROM tblFahrerAutos WHERE " & strBedingung _

            & " GROUP BY FahrerID HAVING Sum(1)>=" & Anzahl & ")"

    End If

    Me.lstFahrer.RowSource = strSQL

    Me.lstFahrer.Requery

End Sub

Die Prozedur durchluft alle markierten Eintrge des Listenfeldes lstAutos und setzt die bentigte SQL-Anweisung zusammen, die anschlieend fr die Eigenschaft Datensatzherkunft des Listenfeldes lstFahrer eingetragen wird.

© 2003-2015 André Minhorst Alle Rechte vorbehalten.