Avatar billede betting Nybegynder
24. juni 2002 - 14:27 Der er 13 kommentarer og
1 løsning

Hvordan bruges flere join (tre tabeller)??

Hej,
Jeg har to sql sætninger som jeg gerne vil kombinere

I første sql sætning trækker jeg alle mine kunder ud og sortere dem - det ser ud som følgende:

SELECT First(t_kunder.knr) AS FørsteOfknr, t_kunder.fornavn, t_kunder.efternavn, t_kunder.cpr, t_investeringer.ks, t_kunder.konsulent FROM t_kunder LEFT JOIN t_investeringer ON t_kunder.knr = t_investeringer.knr GROUP BY t_kunder.fornavn, t_kunder.efternavn, t_kunder.cpr, t_investeringer.ks, t_kunder.konsulent ORDER BY First(t_kunder.knr);

Problemet er blot at t.investeringer.ks er et nummer og ikke et navn. Navnet ligger nemlig i en tredie tabel t_ejendomme og findes vha den anden sql sætning som ser ud som følgende:

SELECT t_investeringer.ks, t_ejendomme.ks_navn
FROM t_ejendomme INNER JOIN t_investeringer ON t_ejendomme.ejendom_id = t_investeringer.ks;

Jeg har prøvet at sætte de to sql sætninger sammen i  Access, men den giver følgende fejlmeddelse:

"SQL-sætningen kan ikke udføres, da den indeholder tvetydige ydre joinforbindeler. Du kan tvinge en af joinforbindelserne til at blive udført først ved at oprette en separat forespørgsel, der udfører den første joinforbindelse, og derefter medtage forespørgslen i SQL- sætningen."

Jeg kan ikke gennemskue hvordan jeg kombinere de to sql sætninger - hvis du kan - hører jeg gerne fra dig.

Avatar billede proaccess Nybegynder
24. juni 2002 - 14:36 #1
Første forsigtige gæt... (er dog nok ret velkvalificeret)

SELECT First(k.knr) AS FørsteOfknr, k.fornavn, k.efternavn, k.cpr, t.ks, t.ks_navn, k.konsulent FROM t_kunder As k LEFT JOIN (SELECT t_investeringer.ks, t_ejendomme.ks_navn
FROM t_ejendomme INNER JOIN t_investeringer ON t_ejendomme.ejendom_id = t_investeringer.ks) AS t ON k.knr = t.knr GROUP BY k.fornavn, k.efternavn, k.cpr, t.ks, k.konsulent ORDER BY First(k.knr);
Avatar billede proaccess Nybegynder
24. juni 2002 - 14:40 #2
Alternativt kan du bruge din 2. forespørgsel, som kilde i stedet for t_investeringer...  (jeg kalder forespørgslen for t_forespørgsel i mit eksempel)

t_forespørgsel: SELECT t_investeringer.ks, t_ejendomme.ks_navn FROM t_ejendomme INNER JOIN t_investeringer ON t_ejendomme.ejendom_id = t_investeringer.ks

t_mål: SELECT First(t_kunder.knr) AS FørsteOfknr, t_kunder.fornavn, t_kunder.efternavn, t_kunder.cpr, t_forespørgsel.ks, t_forespørgsel.ks_navn, t_kunder.konsulent FROM t_kunder LEFT JOIN t_forespørgsel ON t_kunder.knr = t_forespørgsel.knr GROUP BY t_kunder.fornavn, t_kunder.efternavn, t_kunder.cpr, t_forespørgsel.ks, t_forespørgsel.ks_navn, t_kunder.konsulent ORDER BY First(t_kunder.knr)
Avatar billede proaccess Nybegynder
24. juni 2002 - 14:41 #3
UPS: Jeg glemte at medtage t.ks_navn i GROUP BY-delen i det første svar !!!
Avatar billede jakoba Nybegynder
24. juni 2002 - 15:01 #4
Hvorfor vil du overhovedet have en LEFT JOIN der? det giver en resultattabel med samtlige kunder.

FROM (t_ejendomme INNER JOIN t_investeringer ON t_ejendomme.ejendom_id = t_investeringer.ks) right JOIN t_kunder ON t_kunder.knr = t_investeringer.knr;

mvh JakobA
Avatar billede betting Nybegynder
24. juni 2002 - 15:19 #5
Til jakoba - Ja jeg vil gerne have alle kunder og kun dem der er med i et ks skal der skrives et navn på!
Avatar billede betting Nybegynder
24. juni 2002 - 15:24 #6
Til Proaccess - Jeg kunne ikke få dit første svar til at virke men er gået i gang med dit andet svar.

Jeg må dog have lidt hjælp for jeg tror ikke jeg gøer det rigtigt - Lige nu skriver jeg følgende i mit asp-dokument:

soogsql = "SELECT t_investeringer.ks, t_ejendomme.ks_navn FROM t_ejendomme INNER JOIN t_investeringer ON t_ejendomme.ejendom_id = t_investeringer.ks"
Set t_foresporgsel = consoog.Execute(soogSQL)

men det virker ikke - hvad gør jeg galt.
Avatar billede jakoba Nybegynder
24. juni 2002 - 15:34 #7
Avatar billede terry Ekspert
24. juni 2002 - 17:32 #8
betting>if you send the dB to terry@santhell.dk then  I will take a look
Avatar billede terry Ekspert
24. juni 2002 - 20:35 #9
SELECT First(t_kunder.knr) AS FørsteOfknr, t_kunder.fornavn, t_kunder.efternavn, t_kunder.cpr, t_investeringer.ks, t_ejendomme.ks_navn, t_kunder.konsulent
FROM t_ejendomme RIGHT JOIN (t_kunder LEFT JOIN t_investeringer ON t_kunder.knr = t_investeringer.knr) ON t_ejendomme.ejendom_id = t_investeringer.ks
GROUP BY t_kunder.fornavn, t_kunder.efternavn, t_kunder.cpr, t_investeringer.ks, t_ejendomme.ks_navn, t_kunder.konsulent
ORDER BY First(t_kunder.knr);
Avatar billede terry Ekspert
25. juni 2002 - 08:11 #10
hi betting>did it help?
Avatar billede proaccess Nybegynder
25. juni 2002 - 08:48 #11
Du kan bruge denne !

SELECT First(t_kunder.knr) AS FørsteOfknr, t_kunder.fornavn, t_kunder.efternavn, t_kunder.cpr, t_investeringer.ks, t_ejendomme.ks_navn, t_kunder.konsulent FROM (t_kunder LEFT JOIN t_investeringer ON t_kunder.knr = t_investeringer.knr) LEFT JOIN t_ejendomme ON t_investeringer.ks = t_ejendomme.ejendom_id GROUP BY t_kunder.fornavn, t_kunder.efternavn, t_kunder.cpr, t_investeringer.ks, t_ejendomme.ks_navn, t_kunder.konsulent ORDER BY First(t_kunder.knr);
Avatar billede proaccess Nybegynder
25. juni 2002 - 08:51 #12
Mit andet forslag (i går) gik ud fra at du havde lagret din SQL som en forespørgsel, og ikke tilgik databasen via ASP (det havde du jo ikke skrevet noget om...)

Mit svar af 08:48:22, bruger 2 left joins indlejret i hinnanden, det vil sige at alle kunder tages, der medtages investeringsinfo, hvor det er relevant, og der hentes navn for disse investeringsinfo.
Avatar billede betting Nybegynder
25. juni 2002 - 09:51 #13
Tak til Terry
Jeg kunne lige klippe dit forslag ind i mit asp dokument og vupti så virkede det!  - tak for det.
Avatar billede terry Ekspert
25. juni 2002 - 11:36 #14
selv tak :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester