ACCESS Suche



  • Hallo erstmal !

    Ich habe folgendes Problem:
    Ich mache gerade eine Suchmaske und will alle Kunden auflisten die Land1 und Land2 und Land 3 aber nicht nur zb. Land 1 .
    Mit SELECT * from tblkundeland where kukalandID = 1 and kulandID = 2 wird nichts angezeigt und mir or werden alle länder berücksichtigt.
    Ich will aber nur Kunden anzeigen die wirklich genau diese Länder enthalten und nicht nur eine Teilmenge.
    Wie mache ich das am besten ?

    Bei der Suche lese ich zuerst alle Felder aus und überprüfe ob sie ausgefüllt wurden.
    Den Sql Statement String setze ich dann zusammen und führe die abfrage dann aus.
    Ich hoffe alle haben verstanden was ich meine.
    Zur Sicherheit nochmal:

    Ich will alle Kunden auflisten die die Angegeben Länder enthalten aber die die nur eine Teilmenge enthalten nicht anzeigen.
    Die Länder sollen alle in einer Listbox eingetragen werden (Beim Suchformular), wie kann ich am besten alle auslesen ?

    Soll in Access realisiert werden.

    Tabellen:

    --------------------|
    tblKunde            |
    --------------------|
    kundeID             |
    Name                |
    Vorname             |
    Strasse             |
    Bemerkungen         |
    ...                 |
                        |
    --------------------
            |
    --------------------|
    tblKundeLand        |
    --------------------|
    kulaID              |
    kulakundeID         |
    kulaLandID          |
    --------------------
            |
    --------------------|
    tblKunde            |
    --------------------|
    LandID              |
    LandBez             |
    --------------------
    

    Danke im Voraus.

    Gruss Sheldor



  • Falls ich dein Problem richtig verstanden habe, wieso machst du es nicht einfach mit 3 INNER JOINs?

    SELECT
    	*
    FROM
    	tblKunde k
    	INNER JOIN tblKundeLand kl1 ON k.kundeID = kl1.kundeID AND kl1.kulaLandID = 1
    	INNER JOIN tblKundeLand kl2 ON k.kundeID = kl2.kundeID AND kl1.kulaLandID = 2
    	INNER JOIN tblKundeLand kl3 ON k.kundeID = kl3.kundeID AND kl1.kulaLandID = 3
    

    Dadurch, dass es sich um INNER JOINs handelt, fliegen automatisch alle Kunden raus, die nicht alle drei Länder gewählt haben. Übrigens solltest du statt dem Sternchen lieber die Spaltennamen angeben, die du auslesen willst. Hab aus Faulheit ein * genommen 😮



  • Ups, natürlich muss bei "AND kl1.kulaLandID = ..." jeweils statt kl1 der entsprechende Alias hin.



  • Queryschreiber schrieb:

    Falls ich dein Problem richtig verstanden habe, wieso machst du es nicht einfach mit 3 INNER JOINs?

    Das Problem ist es können beliebig viele Länder durchsucht werden.
    Soll ich erst überprüfen wie viele in die Listbox eingetragen wurden und dan in einer Schleife abfragen ?

    Gruss Sheldor



  • Queryschreiber schrieb:

    SELECT
    	*
    FROM
    	tblKunde k
    	INNER JOIN tblKundeLand kl1 ON k.kundeID = kl1.kundeID AND kl1.kulaLandID = 1
    	INNER JOIN tblKundeLand kl2 ON k.kundeID = kl2.kundeID AND kl1.kulaLandID = 2
    	INNER JOIN tblKundeLand kl3 ON k.kundeID = kl3.kundeID AND kl1.kulaLandID = 3
    

    😕

    SELECT * FROM tblKunde k
    INNER JOIN tblKundeLand kl ON k.kundeID = kl.kundeID AND kl.kulaLandID IN ('1','2','3');
    

    VlG



  • Folgender Fehler wenn ich die Abfrage ausführe :

    Verknüpfungsausdruck nicht unterstützt.
    


  • was ist der fehler ?



  • hmmz schrieb:

    Queryschreiber schrieb:

    SELECT
    	*
    FROM
    	tblKunde k
    	INNER JOIN tblKundeLand kl1 ON k.kundeID = kl1.kundeID AND kl1.kulaLandID = 1
    	INNER JOIN tblKundeLand kl2 ON k.kundeID = kl2.kundeID AND kl1.kulaLandID = 2
    	INNER JOIN tblKundeLand kl3 ON k.kundeID = kl3.kundeID AND kl1.kulaLandID = 3
    

    😕

    SELECT * FROM tblKunde k
    INNER JOIN tblKundeLand kl ON k.kundeID = kl.kundeID AND kl.kulaLandID IN ('1','2','3');
    

    VlG

    Dann kriegst du aber auch wieder Kunden, die nur Land 1, Land 2 oder eine Kombination, aber nicht alle gewählt haben 🙄



  • Zu Faul zum einloggen schrieb:

    Das Problem ist es können beliebig viele Länder durchsucht werden.
    Soll ich erst überprüfen wie viele in die Listbox eingetragen wurden und dan in einer Schleife abfragen ?

    Gruss Sheldor

    Ja. Oder du machst es so:

    SELECT
    	COUNT(k.kundeID)
    FROM
    	tblKunde k
    	INNER JOIN tblKundeLand kl ON k.kundeID = kl.kulaKundeID AND kl.kulaLandID IN (1,2,3) /* Laender-IDs */
    GROUP BY
    	k.kundeID	
    HAVING
    	COUNT(k.kundeID) = 3 /* Anzahl an Laendern */
    

    Kanns net testen, also gibts natürlich keine Garantie auf Richtigkeit 😃



  • Wieso denn so umständlich?

    SELECT K.*, KL.* FROM tblKundeLand KL
    INNER JOIN tblKunde K ON (K.kundeID=KL.kulakundeID)
    WHERE KL.kulaLandID = 1 AND KL.kulaLandID = 2 AND KL.kulaLandID = 3;
    

    Wenn die Abfrage eh dynamisch ist, sollte es doch kein Problem sein, so ein paar AND's zusammen zu setzen!



  • hmmz|off schrieb:

    Wieso denn so umständlich?

    SELECT K.*, KL.* FROM tblKundeLand KL
    INNER JOIN tblKunde K ON (K.kundeID=KL.kulakundeID)
    WHERE KL.kulaLandID = 1 AND KL.kulaLandID = 2 AND KL.kulaLandID = 3;
    

    Wenn die Abfrage eh dynamisch ist, sollte es doch kein Problem sein, so ein paar AND's zusammen zu setzen!

    Das wird nichts zurückgeben, die Joins geben pro Datensatz in der Verknüpfungstabelle einen Datensatz verknüpft mit dem entsprechenden Kunden zurück. Danach prüfst du pro Zeile, ob die Land-ID gleichzeitig 1, 2 und 3 ist. Ein Wert kann aber nicht 3 Werte sein, also kommt nichts zurück.



  • Stimmt, hast Recht! Sorry



  • Wie sollte ich das den nun lösen ?
    Ist es überhaupt möglich ?



  • shelldor2 schrieb:

    Wie sollte ich das den nun lösen ?
    Ist es überhaupt möglich ?

    Auf Seite 1 wurden dir doch schon Lösungswege vorgeschlagen. Um eine Schleife, die dir das SQL-Statement generiert, wirst du nicht herumkommen, aber das ist ja auch nicht weiter schlimm.


Anmelden zum Antworten