Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: pmmuc am September 10, 2020, 20:54:49

Titel: Mehrere Kriterien in einer Spalte
Beitrag von: pmmuc am September 10, 2020, 20:54:49
Hallo Zusammen,
ich habe 2 Tabellen (tblNamen und tblEvent) die über eine 3. Tabelle (tblNameEvent) zu einer m:n Verbindung verbunden sind. Wenn ich nun wissen will welcher Name bei welchen Event mit dabei war, so funktioniert das wunderbar.
WHERE tblEvent.Eventbezeichnung = '" & Filter1 & "'Filter1 ist eine Event z.B. Kino.
Wenn ich aber nun wissen will welcher Name bei Event1 UND Event2 ( UND Event3 ....) mit dabei war und die Filterbedingungen über eine AND Verknüpfung verbinde, so bekomme ich immer nur eine leere Tabelle.
Kann mir jemand einen Tipp geben wie ich hier weiterkomme.
Gruß
Peter
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: ShenTo19 am September 10, 2020, 21:48:29
Hallo,
Du darfst die Events nicht mit "und" verknüpfen sondern mit "oder", sonst wird die Bedingung nur erfüllt, wenn der Name bei allen im Filter vorkommenden Events anwesend war. Es könnte je jemand nur bei Event 1 + 3 (oder anderen Kombinationen) gewesen sein.
Gruß Thomas
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: DF6GL am September 10, 2020, 21:49:32
Hallo,



Statt "And" könntest Du "Or" verwenden.
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: pmmuc am September 10, 2020, 22:46:46
schon mal danke für die schnellen Antworten.
Es muss schon eine UND Verknüpfung sein.

Beispiel: (Filtern nach Event1 UND Event2 UND Event3)
Name1 hat teilgenommen an Event1 UND Event2 UND Event3 --> Treffer
Name2 hat teilgenommen an Event1 UND Event3 (aber nicht an Event2) --> kein Treffer.

Bei einer ODER Verknüpfung würde auch Name2 einen Treffer erzielen und das sollte nicht sein.

Gruß Peter
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: DF6GL am September 11, 2020, 09:15:29
Hallo,

zeig mal den Screenshot des Beziehungsfensters (alle Tabellenfelder sichtbar)...

Ansonsten:

Select NachName, Count(Event) AS AnzahlvonEvent
From tblNameEvent
Where Event in ("Kino","Oper","Festival")
Group by NachName
Having Count(Event)=3
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: ebs17 am September 11, 2020, 09:35:21
Ein Feld in einer Spalte enthält (geplant und sinnvollerweise) nur einen Inhalt. Daher kann man nicht direkt auf mehrere Inhalte per AND-Verknüpfung prüfen.

Daher wird man eine OR-Verknüpfung mit einem Zählen verknüpfen. Beipiel auf die Verknüpfungstabelle reduziert:
SELECT
   Name_ID
FROM
   tblNameEvent
WHERE
   Event_ID IN (2, 3, 5, 8)
GROUP BY
   Name_ID
HAVING
   COUNT(*) = 4
Die Anzahl der Elemente in der IN-Klausel muss mit dem Zählen korrespondieren, dabei sollten selbstredend die Kombinationen aus Name und Event eindeutig sein oder vorher eindeutig gestellt werden.

Über einen einfachen Filter oder Parameterübergabe ist das nicht mehr umzusetzen. Man müsste schon die SQL-Anweisung dynamisch zusammensetzen, oder man verwendet alternativ eine zusätzliche Parametertabelle. Im zweiten Fall bleibt die SQL-Anweisung statisch, und die Dynamik erfolgt über Schreiben und Lesen in der Parametertabelle.
SELECT
   Name_ID
FROM
   tblNameEvent
WHERE
   Event_ID IN
      (SELECT MyValue FROM tblParameter)
GROUP BY
   Name_ID
HAVING
   COUNT(*) =
      (SELECT COUNT(*) FROM tblParameter)
Diese Abfrage kann nun mit der Namenstabelle verknüpft werden, um die Klarnamen zu bekommen. Die Auswahl der Events dürfte praktisch sowieso per VBA erfolgen, da wird man also gleich nur die IDs übergeben.
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: pmmuc am September 11, 2020, 10:46:36
Hallo Zusammen,
vielen Dank für die Anregungen. Mit IN und HAVING habe ich bislang noch nicht gearbeitet, werde mich aber gleich damit beschäftigen und versuchen die Vorschläge umzusetzen.
Sobald ich Ergebnisse habe gebe ich natürlich Rückmeldung.
DF6GL: hier noch meine Beziehungen
Beziehungen von FilterVersuch3.jpg

Gruß Peter
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: PhilS am September 11, 2020, 13:35:50
Ich wollte eigentlich schreiben, dass die bisherigen Vorschläge noch nicht zum Ziel führen und man explizit für jedes Event auf die Existenz eines entsprechenden Datensatzes in tblNameEvent prüfen muss. Etwa so:
SELECT ne1.NamenIdRef
FROM tblNameEvent ne1
WHERE ne1.EventIdRef = 1
AND EXISTS (SELECT 'x'
FROM tblNameEvent ne2
WHERE ne2.NamenIdRef = ne1.NamenIdRef
AND ne2.EventIdRef = 2
)
AND EXISTS (SELECT 'x'
FROM tblNameEvent ne3
WHERE ne3.NamenIdRef = ne1.NamenIdRef
AND ne3.EventIdRef = 3
)

Bei genauerem Hinschauen muss ich anerkennen, dass die Lösung von @ebs17 richtig clever ist und durch das Eliminieren der Duplikate beim Zählen sogar auch dann funktioniert, wenn es Mehrfachzuordnungen von einem Event zu einem Namen gibt.
In Verbindung mit der Parametertabelle ist die Lösung von ebs17 deutlich einfacher zu handhaben.
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: ebs17 am September 11, 2020, 19:16:16
Dank an Philipp: Es ist immer wieder gut, verschiedene Formulierungen von Abfragen zu sehen und überhaupt daran zu denken, dass es sie gibt und man sie prüfen kann.

Solche wie von Dir gezeigten EXISTS-Reihen hatte ich mal im Einsatz, als eine Aufgabenstellung etwa so lautete: Finde die Namen, die an allen Events 1+3+4, nicht jedoch bei Events 2+5 teilgenommen haben. Oder auch Teilnahme an 1+4+7, aber nicht an 2+8 usw. in der Verkettung.
Eine solche Anweisung hatte dann mit realen Bedingungen eine Textlänge von etwa 1.300 Zeichen (bei sparsamer Klammerung und Kurz-Tabellenaliasen)), immerhin noch weit weg von möglichen 64.000.
So etwas schreibt man dann aber nicht mehr per Hand, sondern per VBA mit Textbausteinen in Schleife mit Ersetzungen von Platzhaltern.
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: pmmuc am September 11, 2020, 20:34:08
Hallo,
nach langem Probieren bin ich zu der Erkenntnis gekommen, dass ich noch weitere Hilfe benötige.
Ich habe nun folgenden Code:
SQL = "SELECT tblNameEvent.NamenIDRef, tblNameEvent.EventIDRef, tblNameEvent.NamEventID" & _
" FROM tblNameEvent" & _
" WHERE EventIDRef IN(SELECT EventFilter FROM tblParameter)" & _
" GROUP BY tblNameEvent.NamenIDRef, tblNameEvent.EventIDRef, tblNameEvent.NamEventID" & _
" HAVING COUNT(*) = (SELECT COUNT(*) FROM tblParameter)"
   
Me.lstGefiltert2.RowSource = SQL
Bis zur Zeile Group By ... funktioniert alles Erwartungsgenäß.
Sobald ich aber die Zeile Having Count(*) ... hinzufüge, bekomme ich immer eine leere Liste.
Wo liegt mein Fehler?

Gruß Peter
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: ebs17 am September 11, 2020, 21:02:23
In meinem Vorschlag steht sehr bewusst und absichtlich nur eine ID im SELECT- sowie im GROUP BY-Abschnitt. Jede Abweichung davon setzt eine andere Logik um und wird ein anderes Ergebnis als nachgefragt bringen.
Warum bringst Du da eigene "Kreativität" ein?

Ein Gruppieren über den Primärschlüssel ist dann zusätzlich sinnfrei, da dieser definiert eindeutig ist und somit nicht in gleiche Gruppen zusammenfassbar ist.
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: pmmuc am September 11, 2020, 21:24:48
Danke für den Hinweis.
Es ist wohl weniger eigene Kreativität als mehr eigenes Unwissen.
Ich habe nun den Code geändert in
SQL = "SELECT tblNameEvent.NamenIDRef" & _
" FROM tblNameEvent" & _
" WHERE EventIDRef IN(SELECT EventFilter FROM tblParameter)" & _
" GROUP BY tblNameEvent.NamenIDRef" & _
" HAVING COUNT(*) = (SELECT COUNT(*) FROM tblParameter)"
   
Me.lstGefiltert2.RowSource = SQL
Ich bekomme nun ein Ergebnis, es muss aber noch ein Fehler vorhanden sein, denn das Ergebnis ist leider falsch.
In meinem Beispiel habe ich in der Parametertabelle zwei Events stehen, bekomme aber in der Ergebnisliste auch Namen angezeigt die nur an einem Event teilgenommen haben.
Ich hoffe auf nochmalige Hilfe.
Gruß Peter
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: ebs17 am September 12, 2020, 09:20:45
ZitatSELECT EventFilter FROM tblParameter
Aus diesem Teil der Anweisung sollte klar genug hervorgehen, dass die Parametertabelle genau ein Feld hat und die eingetragenen Werte Datensätze bilden.
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: PhilS am September 12, 2020, 09:47:42
Muss nicht die EventId ebenfalls in der Liste der Ausgabespalten sein, um über die Gruppierung die korrekte Anzahl zu erhalten?
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: pmmuc am September 12, 2020, 13:26:45
Vielen Dank für die Hilfe, aber jetzt bin ich komplett abgehängt.
Meine Parametertabelle sieht wie folgt aus:
tblParameter.jpg
Die Spalte EventFilter ist LongInteger und ich trage hier die Events (ID) ein, nach denen gefilter werden soll. Jedes Event eine neue Zeile. Muss ich hier etwas anders machen?

Wie soll ich denn nun meinen Code verändern.
Bitte habt Verständnis ich bin Access-Anfänger und verstehe evtl. manches falsch.
Gruß Peter
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: ebs17 am September 12, 2020, 14:02:31
Dann ist die Parametertabelle so wie sie sein sollte und Du hast ggf. das nicht hinreichend berücksichtigt:
Zitatdabei sollten selbstredend die Kombinationen aus Name und Event eindeutig sein

Bei falschen (nicht so erwarteten) Ergebnissen kann auch statt eines Codefehlers ein Datenfehler die Ursache sein.
Da könnte man bspw. so reagieren:
SELECT
   NE.Name_ID
FROM
   (SELECT DISTINCT Name_ID, Event_ID FROM tblNameEvent) AS NE
WHERE
   NE.Event_ID IN
      (SELECT MyValue FROM tblParameter)
GROUP BY
   NE.Name_ID
HAVING
   COUNT(*) =
      (SELECT COUNT(*) FROM tblParameter)

Laut Deinem Beziehungsbild machen Duplikate allerdings gar keinen Sinn und sollten bereits über einen zusammengesetzten eindeutigen Index (https://www.ardiman.de/datenbanken/grundlagen/tabellen/#SEC1) verhindert werden.
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: pmmuc am September 12, 2020, 19:27:19
Es funktioniert!
Vielen Dank.
Ja, das Problem waren tatsächlich einige gedoppelte und damit nicht eindeutige Datensätze.
Den Hinweis zum zusammengesetzten Index werde ich gleich noch mit umsetzen, bislange habe ich nur einen einfachen Index verwendet (wie man sieht mit fatalen Folgen).
Vielen Dank für Eure Geduld mit mir.
Gruß Peter
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: ebs17 am September 12, 2020, 19:42:42
Zitateinen einfachen Index verwendet
Mit Setzen der referentiellen Integrität bei der Erstellung einer Beziehung wird das Fremdschlüsselfeld automatisch indiziert (leider nicht sichtbar, nur über Codeabfrage darstellbar). Daher sind selbst gesetzte Einzelindizes auf Fremdschlüsselfelder überflüssig und eigentlich sogar schädlich (Aufwand für nichts, weil doppelt).
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: pmmuc am September 12, 2020, 20:51:28
Danke.

Noch eine Frage:
Um zu lernen studiere ich gerade Deinen vorletzten Post. Für was steht eigentlich das NE.
Ist es eine neu Tabelle die anzulegen ist?

Gruß Peter
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: ebs17 am September 12, 2020, 21:34:46
ZitatFür was steht eigentlich das NE
Das ist ein Tabellenalias, siehe Grundlagen - SQL ist leicht (2) - Alias (https://www.ms-office-forum.net/forum/showthread.php?t=298432)

Sowie gerne verwendet: Abkürzung mit gedanklichem Bezug zum eigentlichen Namen:
tblNameEvent
Titel: Re: Mehrere Kriterien in einer Spalte
Beitrag von: pmmuc am September 12, 2020, 21:40:10
Danke

Gruß Peter