24. juni 2002 - 14:27Der 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.
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);
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)
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;
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);
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);
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.
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.