none
Auswahlabfrage mit Kriterien in anderer Tabelle

    Frage

  • Hallo NG,

    ich stehe vor folgendem Problem: Ich möchte eine Auswahlabfrage für eine Access-Tabelle erstellen, die als Suchkriterien Werte in einer anderen Tabelle verwendet. Das klingt zunächst einmal sicher nach einem einfachen INNER JOIN. Meine Schwierigkeit ist aber die, dass auch solche Datensätze ausgewählt werden sollen, bei denen die Kriterien (Zeichenfolgen) eventuell nur teilweise mit denen in der Auswahltabelle übereinstimmen. Ein Beispiel macht es sicher deutlicher:

    Tabelle1 enthält die Datensätze. Nehmen wir an, hier gibt es eine Spalte mit der Bezeichnung Monate, die diese Werte enthält:

    Januar
    Februar
    März
    April
    Mai
    Juni
    Juli
    August
    September
    Oktober
    November
    Dezember

     

    Tabelle2 enthält eine Spalte, nennen wir sie "Suchstring", die folgende Werte enthält

    ember
    Ju

    Die Auswahlabfrage soll mir also alle Datensätze aus Tabelle1 liefern, bei denen der Wert in Spalte Monate einen (oder auch mehrere) der in Spalte Suchstring von Tabelle2 enthaltenen Strings beinhaltet. Das wären dann also folgende:

    Juni
    Juli
    September
    November
    Dezember

    Hat vielleicht jemand einen Tipp für mich, wie ich das als SQL-String formulieren muss?

    Vielen Dank
    Thomas

    Donnerstag, 18. November 2010 14:58

Antworten

  • Gelegenheits-Coder wrote:

    ...
    Tabelle1 enthält die Datensätze. Nehmen wir an, hier gibt es eine
    Spalte mit der Bezeichnung Monate, die diese Werte enthält:

    Januar
    Februar
    ...
    Tabelle2 enthält eine Spalte, nennen wir sie "Suchstring", die
    folgende Werte enthält

    ember
    Ju

    Die Auswahlabfrage soll mir also alle Datensätze aus Tabelle1
    liefern, bei denen der Wert in Spalte Monate einen (oder auch
    mehrere) der in Spalte Suchstring von Tabelle2 enthaltenen Strings
    beinhaltet. Das wären dann also folgende:

    Juni
    Juli
    September
    November
    Dezember
    ...

    SELECT Tabelle1.Monate, Tabelle2.Suchstring
    FROM Tabelle1 INNER JOIN Tabelle2
      ON Tabelle1.Monate Like "*" & Tabelle2.Suchstring & "*"
    WHERE Tabelle2.Suchstring Is Not Null

    Diesen sog. Non-Equi-Join kann Access übrigens nicht in der
    Entwurfsansicht einer Abfrage darstellen. Musst du also in der
    SQL-Ansicht basteln.


    Servus
    Karl
    *******
    Access-FAQ: http://www.donkarl.com

    Donnerstag, 18. November 2010 15:13

Alle Antworten

  • Gelegenheits-Coder wrote:

    ...
    Tabelle1 enthält die Datensätze. Nehmen wir an, hier gibt es eine
    Spalte mit der Bezeichnung Monate, die diese Werte enthält:

    Januar
    Februar
    ...
    Tabelle2 enthält eine Spalte, nennen wir sie "Suchstring", die
    folgende Werte enthält

    ember
    Ju

    Die Auswahlabfrage soll mir also alle Datensätze aus Tabelle1
    liefern, bei denen der Wert in Spalte Monate einen (oder auch
    mehrere) der in Spalte Suchstring von Tabelle2 enthaltenen Strings
    beinhaltet. Das wären dann also folgende:

    Juni
    Juli
    September
    November
    Dezember
    ...

    SELECT Tabelle1.Monate, Tabelle2.Suchstring
    FROM Tabelle1 INNER JOIN Tabelle2
      ON Tabelle1.Monate Like "*" & Tabelle2.Suchstring & "*"
    WHERE Tabelle2.Suchstring Is Not Null

    Diesen sog. Non-Equi-Join kann Access übrigens nicht in der
    Entwurfsansicht einer Abfrage darstellen. Musst du also in der
    SQL-Ansicht basteln.


    Servus
    Karl
    *******
    Access-FAQ: http://www.donkarl.com

    Donnerstag, 18. November 2010 15:13
  • hallo Thomas,

    deine Vermutung bezüglich INNER JOIN ist korrekt. Du musst lediglich dir JOIN Bedingung anpassen:

    SELECT Content.*
    FROM Search
    INNER JOIN Content
    ON Content.Payload LIKE "*" & Search.Search & "*";

    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Donnerstag, 18. November 2010 15:20
    Moderator
  • Hallo Thomas,

    eine alternative Möglichkeit ist mit einem Subselect in der Where-Klausel anstatt eines Joins:

    SELECT Monate.Monat
    FROM Monate
    WHERE ((((SELECT Suchstrings.suchstring FROM Suchstrings WHERE Monate.Monat LIKE '*' + suchstring + '*')) Is Not Null));

    Welche von beiden Varianten ist performanter? Habe ich nicht ausprobiert.

     

    Viele Grüße,

    Michael schörner

    Donnerstag, 18. November 2010 15:31
  • hallo Michael,

    Welche von beiden Varianten ist performanter? Habe ich nicht ausprobiert.

    In den meisten Fällen der JOIN, aber das ist keine Faustregel. Hier bedarf es immer einer Analyse, sprich du musst es testen. Im Besonderen dürft hier aber das Suchmuster bremsen, da es verhindert das Indices benutzt werden können.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Donnerstag, 18. November 2010 15:35
    Moderator
  • Perfekt. Das ist exakt das, was ich gesucht habe, und es funktioniert bei mir auch wunderbar. Ganz herzlichen Dank, Karl, für deine superschnelle und kompetente Hilfe. Ich finde es übrigens auch sehr hilfreich, dass du gleich noch ein paar Worte dazu gesagt hast. So weiß ich beim nächsten Mal gleich besser, wonach ich suchen muss.

    Also, vielen Dank
    und einen schönen Abend.

    Thomas

    Donnerstag, 18. November 2010 16:01
  • Hab gerade gesehen, dass nach Karls Post noch weitere Lösungen eingingen. Ganz herzlichen Dank natürlich auch an euch für eure Mühe. Ich konnte es auf die von Karl beschriebene Weise bei mir umsetzen.

    Euch allen einen schönen Abend

    Thomas

    Donnerstag, 18. November 2010 16:05