MSAccess Inner Join über 2 Tabellen mit Group und Where - Problem

chrisatack

Grünschnabel
Hi

Ich bin neu hier bei euch im Froum, hoffe aber auf eine
keine Hilfestellung. Ich suche schon seit über ner Woche....

Aber nun zum Problem..
es gibt zwei Tabellen

objekte und objkeys ... verbunden mit objekte.objid = objkeys.parentid
es kann also für objekte bis zu 6 objkeys geben.

jetzt möchte ich mit einer Abfrage eine Suche über beide Tabellen ( am besten mit JOIN verbunden oder? )
machen und dabei z.b. Folgenden Sachen suchen...

Aus der objekte Tabelle:
----------------------------------------------------
objekte.objshort LIKE '%Bestellung%'
objekte.objmask LIKE 10
.... noch mehrere, aber ich denke um den Weg zu verstehen ist das egal

Aus der objkeys Tabelle:
----------------------------------------------------
objkeys.okeyno = 0 AND objkeys.okeydata LIKE '%Contelo%'
objkeys.okeyno = 1 AND objkeys.okeydata LIKE '%17.02.2009%'
objkeys.okeyno = 2 AND objkeys.okeydata LIKE '%0123%'

Da es ja zu einer objekte.objid mehrere parentids gibt muss ich
hier mehrmals objkeys.okeyno und objkeys.okeydata abfragen.
Wenn ich das natürlich über WHERE mache bekomme ich natürlich keine Antwort
weil ja objkeys.okeyno nicht gleich 1 und 0 sein kann...

Wie gehe ich da also jetzt ran....
All meien Versuche haben mich nicht einmal in die
Richtung eines brauchbaren Ergebnisses gebracht...

Ich habe dazu die db angehangen.

Vielen Dank schon einmal im Vorraus...

MFG chris :D
 

Anhänge

  • db.7z
    23,8 KB · Aufrufe: 9
Mach mal ein: Das habe ich - und ein: Das will ich

Weil von deiner Beschreibung her hab ich so gut wie nichts verstanden, wie das am Ende aussehen soll
 
Wenn du die 2 Taebllen mit einem JOIN verknüpfst, hast du nachher [Anzahl(objkeys)] Zeilen.
Darüber kannst du ganz normal den WHERE setzen.
Anschliessend die Felder von objkeys nicht ausgeben und mit einem DISTINCT (oder GROUP BY) die Doppelten objekte entfernen

SQL:
SELECT DISTINCT
    objekte.*
FROM
    objekte
    INNER JOIN objkeys ON objekte.objid = objkeys.parentid
WHERE
    objekte.objshort LIKE '%Bestellung%'
    AND objekte.objmask LIKE 10
    AND (
        (objkeys.okeyno = 0 AND objkeys.okeydata LIKE '%Contelo%')
        OR (objkeys.okeyno = 1 AND objkeys.okeydata LIKE '%17.02.2009%')
        OR (objkeys.okeyno = 2 AND objkeys.okeydata LIKE '%0123%')
    )
 
Zuletzt bearbeitet von einem Moderator:
Danke erst einmal für die Antwort @Yaslaw

Die Richtung ist schon einmal sehr gut. Nur leider ist das Ergebnis noch nicht ganz richtig.
Dein SQL...
SQL:
SELECT DISTINCT
    objekte.*
FROM
    objekte
    INNER JOIN objkeys ON objekte.objid = objkeys.parentid
WHERE
    objekte.objshort LIKE '%Bestellung%'
    AND objekte.objmask LIKE 10
    AND (
        (objkeys.okeyno = 0 AND objkeys.okeydata LIKE '%Contelo%')
        OR (objkeys.okeyno = 1 AND objkeys.okeydata LIKE '%17.02.2009%')
        OR (objkeys.okeyno = 2 AND objkeys.okeydata LIKE '%0123%')
        )
liefert zwei Ergebnisse...
objid 8 und 24.
ID 8 Ist richtig da alle Suchbegriffe aus den objkeys auch zutreffen.
Bei ID 24 trifft aber nur objkeys.okeyno = 0 AND objkeys.okeydata LIKE '%Contelo%'
es müssen aber alle zutreffen... verbinde ich jetzt wieder die Abrage mit AND
habe ich natürlich Null Ergebnisse.... und genau das ist mein Problem...

Da muss es doch noch eine andere Lösung geben oder?

Vielen Dank für die Hilfe...

MFG chris :D
 
Zuletzt bearbeitet von einem Moderator:
Wechlse zurück zu GROUP BY und erweitere es um einen HAVING
SQL:
SELECT
    objekte.objid
FROM
    objekte
    INNER JOIN objkeys ON objekte.objid = objkeys.parentid
WHERE
    objekte.objshort LIKE '*Bestellung*'
    AND objekte.objmask LIKE 10
    AND (
        (objkeys.okeyno = 0 AND objkeys.okeydata LIKE '*Contelo*')
        OR (objkeys.okeyno = 1 AND objkeys.okeydata LIKE '*17.02.2009*')
        OR (objkeys.okeyno = 2 AND objkeys.okeydata LIKE '*0123*')
    )
GROUP BY
    objekte.objid
HAVING
    COUNT(*)=3

Also im HAVING (ein WHERE nach dem Gruppieren) können wir die Anzahl Records zählen und kontrollieren ob wir wirklich 3 haben....
 
Zuletzt bearbeitet von einem Moderator:
Hi..

Ich habe doch noch 2 Fragen...

erstens wenn ich meine Ergebnisse Counten will
ca. so...

SQL:
SELECT
    objekte.objid,
    objekte.objtype,
    objekte.objshort,
    objekte.objxdate,
    COUNT(*) AS a_count 
FROM  
    objekte 
    INNER JOIN objkeys ON objekte.objid = objkeys.parentid
WHERE
    objekte.objshort LIKE '%Bestellung%'
    AND objekte.objmask LIKE 10     
    AND (                                            
            (objkeys.okeyno = 0 AND objkeys.okeydata LIKE '%G%') 
         OR (objkeys.okeyno = 1 AND objkeys.okeydata LIKE '%20%')
        )                              
GROUP BY                   
    objekte.objid,
    objekte.objtype,     
    objekte.objshort,
    objekte.objxdate      
HAVING                     
    COUNT(*) = 2       
ORDER BY       
    objekte.objshort ASC

Warum bekomme ich für a_count immer 2 raus obwohl ich 3 ergebnisse habe?

zweitens würde ich gerne auch Daten aus objkeys mit ausgeben lassen.
Also das mein Ergebnis dann ca. folgendermaßen aussieht, wenn das überhaupt geht.

objekte.objidobjekte.objtypeobjekte.objshortobjekte.objxdatea_count objkeys.okeydata_0objkeys.okeydata_1
8259Bestellung (TIF, mehrseitig, sw, 200dpi) - Dokument mit mehreren Versionen592056003Contelo GmbH17.02.2009
23259Bestellung Contelo (TIF sw 200dpi)579139203Krammper GmbH09.02.2010
24259Bestellung Krammper (TIF sw 200dpi))579139203Contelo GmbH09.02.2010

Vielen Dank schon einmal für die Hilfe.
( DB ist im ersten Post )

MFG Chris :D
 
Zuletzt bearbeitet von einem Moderator:
Du hast immer % anstelle von * drin. arbeitest du wirklich mit MS Access?

a_count ist natürlich 2, du hast ja selber ien Argument rausgenommen und entsprechend im HAVING den Vergleich von 3 auf 2 angepasst.

Die Daten kannst du so anhängen
SQL:
SELECT
    objekte.objid,
    objekte.objtype,
    objekte.objshort,
    objekte.objxdate,
    COUNT(*) AS a_count,
    MAX(IIF(objkeys.okeyno = 0, objkeys.okeydata, "")) AS okeydata_0,
    MAX(IIF(objkeys.okeyno = 1, objkeys.okeydata, "")) AS okeydata_1
FROM  
    objekte 
    INNER JOIN objkeys ON objekte.objid = objkeys.parentid
WHERE
    objekte.objshort LIKE '*Bestellung*'
    AND objekte.objmask LIKE 10     
    AND (                                            
            (objkeys.okeyno = 0 AND objkeys.okeydata LIKE '*G*') 
         OR (objkeys.okeyno = 1 AND objkeys.okeydata LIKE '*20*')
        )                              
GROUP BY                   
    objekte.objid,
    objekte.objtype,     
    objekte.objshort,
    objekte.objxdate
HAVING                     
    COUNT(*) = 2       
ORDER BY       
    objekte.objshort ASC
 
Zuletzt bearbeitet von einem Moderator:
Hi..

Ja das ganze ist 100% Ms Access
Ich benutze das ganze über PHP und ODBC und ich bekomme nur ein Ergebnis mit % ( Prozent )

eins habe ich leider noch

wenn ich das hier starte...
SQL:
SELECT
    objekte.objid,
    objekte.objtype,
    objekte.objshort,
    objekte.objxdate,
    COUNT(*) AS a_count,
    MAX(IIF(objkeys.okeyno = 0, objkeys.okeydata, "")) AS okeydata_0,
    MAX(IIF(objkeys.okeyno = 1, objkeys.okeydata, "")) AS okeydata_1,
    MAX(IIF(objkeys.okeyno = 2, objkeys.okeydata, "")) AS okeydata_2,
    MAX(IIF(objkeys.okeyno = 3, objkeys.okeydata, "")) AS okeydata_3
FROM  
    objekte   
    INNER JOIN objkeys ON objekte.objid = objkeys.parentid
WHERE                   
    objekte.objshort LIKE '%Bestellung%'
    AND objekte.objmask LIKE 10     
    AND (                                            
            (objkeys.okeyno = 0 AND objkeys.okeydata LIKE '%Contelo%') 
         OR (objkeys.okeyno = 1 AND objkeys.okeydata LIKE '%02.20%')
        )                              
GROUP BY                   
    objekte.objid,
    objekte.objtype,     
    objekte.objshort,
    objekte.objxdate
HAVING                     
    COUNT(*) = 2       
ORDER BY       
    objekte.objshort ASC

bleibt okeydata_2 und okeydata_3 immer leer warum?
Danke schon einmal...

MFG Chris
 
Zuletzt bearbeitet von einem Moderator:
Weil du key 2 und 3 in deine WHERE ausblendest. Das folgende gibt dir nur Key 1 und 2 zurück
SQL:
    AND (                                            
            (objkeys.okeyno = 0 AND objkeys.okeydata LIKE '%Contelo%') 
         OR (objkeys.okeyno = 1 AND objkeys.okeydata LIKE '%02.20%')
        )
 

Neue Beiträge

Zurück