20. juli 2004 - 14:02Der er
20 kommentarer og 1 løsning
INNER JOIN i mange til mange relation
Jeg har en access-db hvor der er en mange til mange relation.
Derfor har jeg oprettet en såkaldt hjælpetabel som er "linket" mellem de to tabeller (tabel 1 og tabel 3) som jeg skal hente data fra.
Der skal hentes en hovedvare (intet problem i det) og de evt. tilhørende varer (= portefølje varer) som kan bestilles sammen med hovedvaren hvis brugeren ønsker det.
Dvs. der kan være fra 0..x antal proteføljevarer i tabel 3.
tabel 1 : indeholder alle varer PK = catalogID
tabel 2 : hjælpetabel catid = refererer til catalogID i tabel 1 pfid = referer til id for portefølje vare i tabel 3
tabel 3 : indeholder alle porteføljevarer som kan bestilles sammen med en hovedvaren. pid = refererer til pdif i tabel 2. catid = id for porteføljevare som igen refererer til dens id i tabel 1 hvor data er.
Har forsøgt mig med denne SQL :
Dim SQLportef, rsportef SQLportef = "SELECT * FROM products INNER JOIN " &_ "(portefolje INNER JOIN prodport ON portefolje.Pid = prodport.pfid) " &_ "ON products.catalogID = prodport.catid " &_ "WHERE products.catalogID = prodport.catid AND products.catalogID = "&vareid&";"
Den tredje ting er, at jeg (måske fejlagtigt) troede at syntaxen mindede om MS SQL. Men jeg er faktisk ikke helt sikker på om Access understøtter det at lave alias på en tabel i et select ? Det kan i stedet godt være, at Access benytter parenteserne til at skelne, og i så fald kan måske følgende virke :
Ja, det skal være "ON prodport.pfid = portefolje.pid) " &_. Har rettet til.
Længere nede skrev du "ON portefolje.catid = hovedvare.catid) " &_, men så vidt jeg kan se skal det være "ON portefolje.catid = products.catalogID) " &_
Bare for at være sikker er her hvad jeg mener der sker i SQL-sætningen : --------------------------------------- JOIN 1 : "(prodport INNER JOIN " &_ "(products ON products.catalogID = prodport.catid) " &_ "ON prodport.pfid = portefolje.pid) " &_
Forklaring : Først hentes først alle catalog-id'er over i products-tabellen som matcher hinanden i products og prodport-tabellerne. Derefter hentes alle alle portefølje-id'er over i prodport-tabellen som matcher hinanden ud fra ovenstående resultat i products-tabellen. --------------------------------------------
Dine INNER JOIN er bygget forkert op. Prøv sådan her:
SQLportef = "SELECT * FROM (products INNER JOIN " &_ "prodport ON products.catalogID = prodport.catid) " &_ "INNER JOIN portefolje ON prodport.pfid = portefolje.pid " &_ "WHERE products.catalogID = "&vareid&";"
Hvis du har access installeret kan du bruge access indbyggede Query builder eller på danske "Forspørgelser" til at bygge din SQL ud fra dine tabeller. Du kan angive relationen imellem tabellerne.
Ok så må SQL udvides med en INNER JOIN mere, her giver man også tabellen et alias sådan det tolkes som to tabeller:
SELECT products_data.* FROM ((products INNER JOIN prodport ON products.catalogID = prodport.catid) INNER JOIN portefolje ON prodport.pfid = portefolje.pid) INNER JOIN products as products_data ON portefolje.catid=products_data.catalogID WHERE products.catalogID = 19;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.