Avatar billede dodger Nybegynder
25. september 2001 - 19:11 Der 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??
Avatar billede dodger Nybegynder
25. september 2001 - 19:35 #1
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 :)
Avatar billede mugs Novice
25. september 2001 - 19:39 #2
Hvilket resultat viser forespørgslen?
Avatar billede mugs Novice
25. september 2001 - 19:41 #3
SELECT Svar_til_Spoergsmaal.nummer, *
Hvad betyder .nummer?
Avatar billede dodger Nybegynder
25. september 2001 - 19:43 #4
nummer er felt navn i tabellen Svar_til_Spoergsmaal.
Jeg får at vide, at \"Join expression is not supported.\".
Avatar billede mugs Novice
25. september 2001 - 19:46 #5
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!!
Avatar billede dodger Nybegynder
25. september 2001 - 19:49 #6
Dette er ikke probelemet.
Syntaksen er god nok, men SQL-oversætteren til access er noget l#¤%...
Så jeg skal bruge noget alternativt til mine joins.

biu INNER JOIN sib ON biu.spgID = sib.spgID
kan skrives om til

FROM biu, sib
WHERE biu.spgID = sib.spgID

Men hvordan skriver jeg et left join om??
Avatar billede mugs Novice
25. september 2001 - 19:49 #7
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.
Avatar billede mugs Novice
25. september 2001 - 19:52 #8
Du kan altid ændre en left join til en right join (og omvendt) ved at bytte om på den rækkefølge, tabellerne vises i.
Avatar billede dodger Nybegynder
25. september 2001 - 19:54 #9
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
Avatar billede mugs Novice
25. september 2001 - 20:00 #10
Okay: et sidste forslag fra en ikke SQL kyndig:

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.
Avatar billede dodger Nybegynder
25. september 2001 - 20:00 #11
??
Avatar billede proaccess Nybegynder
25. september 2001 - 20:01 #12
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å...
Avatar billede mugs Novice
25. september 2001 - 20:03 #13
Så kom der en haj - velkommen, jeg har vist rodet mig ud i noget værre noget!!
Avatar billede proaccess Nybegynder
25. september 2001 - 20:09 #14
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...

Se dér fik jeg vist rodet mig ud i noget... ;-)
Avatar billede mugs Novice
25. september 2001 - 20:12 #15
o:)
Avatar billede dodger Nybegynder
25. september 2001 - 20:18 #16
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;

Dette bruger en blanding af joins...
Avatar billede dodger Nybegynder
25. september 2001 - 20:19 #17
Jeg vil stadig give de 60 point hvis der er nogen der kan svare på om hvordan man kan skrive en left join i where delen...
Avatar billede nih Novice
25. september 2001 - 22:06 #18
Jeg er ingen haj i SQL, men plejer selv at oprette en mellem forespørgsel og bruge reultatet herfra som join i den oprindelige forespørgsel.

måske lidt gnidret formuleret, men håber nogen af jer forstår ;o)

Niels

Avatar billede proaccess Nybegynder
26. september 2001 - 09:22 #19
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);

Dette foregår UDEN joins !!!
Avatar billede dodger Nybegynder
26. september 2001 - 14:12 #20
Dette er en måde... Tak for svaret :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