25. september 2001 - 19:11Der er
19 kommentarer og 1 løsning
Left Joins i where delen
Jeg har problemer med at køre følgende i Access:
SELECT Svar_til_Spoergsmaal.nummer, * FROM Svar LEFT JOIN Svar_til_Spoergsmaal ON Svar.SvarID = Svar_til_Spoergsmaal.SvarID, biu INNER JOIN sib ON biu.spgID = sib.spgID WHERE Svar.BrugerID = bid ORDER BY biu.nummer, sib.nummer
Jeg tænkte at man kunne flytte de to joins ned i where delen, men hvordan kan man udtrykke et left join i where delen??
Kom nu en eller anden. Hvis spørgsmålet er svaret inden kl 20.00 i dag 25/9 så smider jeg 100 point ekstra oven i. Og det skal være et svar jeg kan bruge til noget :)
SELECT Svar_til_Spoergsmaal.nummer, * Prøv som udgangspunkt at erstatte . med et , Jeg er ikke den store ekspert i SQL, men da ingen andre er på banen!!
Der er 2 udgaver af en outer join, nemlig en left og en right join. En outer join viser de poster, der opfylder joinen, sammen med alle de øvrige poster i den ene tabel. Om du bruger en left eller en right join, afhænger af, om de overskydende poster skal vises fra tabellen på venstre eller højre side af joinen. Du kan ændre en outer join ved at ændre joinegenskaberne i forespørgslens designvisning.
Jamen problemt er, at access ikke kan overskue en left (eller right) join når der er andre joins. Den ved ikke i hvilken rækkefølge den skal gøre det... Og det hjælper ikke at sætte parenteser
Prøv i din formular kan du indsætte en RUNSQL-sætning. Du kan evt. benytte makrogeneratoren til at danne din SQL, hvis det fungerer konverterer du makroen til VBA.
Har du overvejet at Join-typen skal være ens gennem hele forespørgslen... (LEFT)
derefter kan du checkke om der er nogle Null-værdier (som der ikke må være ved Inner joins)
Når vi skriver direkte om til WHERE -delen, skal du have noget UNION SELECT med, for at finde de poster, som ikke er relaterede, og det er vist en lang vej at gå...
Ja, og jeg sidder lige nu ved en pc uden access... så jeg kan vist kun komme med generelle hints denne gang...
Princippet skal være at HELE forespørgslen skal have samme JOIN-type. Derefter laves begrænsninger så at der i 2. tabel enten kan være Null på nøglen eller Øvrige betingelser opfyldt, derefter skal der være et join mellem 2. og 3. tabel, hvor 3. tabels nøglefelt ikke må være Null...
Jeg har selv fundet en løsning, der dog ikke besvare spørgsmålet... Dette er testet og virker 100% som det skal:
SELECT sts.nummer AS nummer FROM (Svar LEFT JOIN Svar_til_Spoergsmaal AS sts ON Svar.SvarID = sts.SvarID) INNER JOIN (Spoergsmaal_i_et_batteri AS sib INNER JOIN Batterier_i_undersoegelsen AS biu ON sib.BatteriID = biu.BatteriID) ON Svar.SpgID = sib.SpgID WHERE (((Svar.BrugerID)=[bid])) ORDER BY biu.nummer, sib.nummer;
Hvis du forestiller dig 2 tabeller \"Postnumre\" og \"Kunde\", så kan du bruge denne til at liste alle kunder for alle postnumre (incl. postnumre uden kunder)
Først findes de postnumre med kundeoplysninger, og derefter tilføjes postnumre uden kundeoplysninger...
SELECT Postnumre.Postnr, Postnumre.Bynavn, Kunde.Kunde, Kunde.Navn FROM Postnumre, Kunde WHERE Postnumre.Postnr=[Kunde].[Postnr] UNION SELECT Postnumre.Postnr, Postnumre.Bynavn, Null, Null FROM Postnumre WHERE Postnumre.Postnr NOT IN (SELECT Postnr FROM Kunde);
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.