09. oktober 2008 - 16:56Der er
7 kommentarer og 1 løsning
Hvorfor virker følgende SQL ikke? (ang val, mid og inner join)
jeg har konstrueret nedestående SQL, og denne vil ikke joine. "tblklager.sælgernr" er et nummer på 5 cifre, og de første 3 skal joines med "TblBureau.Sælgernr"
UPDATE TblBureau INNER JOIN tblklager ON TblBureau.Sælgernr=VAL(MID(tblklager.sælgernr,1,3)) SET tblklager.[E-mail] = tblbureau.[e-mail] WHERE (((tblklager.[E-mail]) Is Null) AND ((tblklager.Behandlet)=0));
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
Det er <ON TblBureau.Sælgernr=VAL(MID(tblklager.sælgernr,1,3))> den er gal med. Når du joiner skal det ske mellem to "rene" felter.
Du kan let løse problemet ved at skyde en forespørgsel ind imellem, hvor du konverterer sælgernummeret: - Opret en udvælgelsesforespørgsel baseret på tblklager (vi kalder den Q_Klager) - Medtag alle relevante felter og tilføj et nyt: Sælger: VAL(MID(tblklager.sælgernr,1,3))
Så kan du joine således: UPDATE TblBureau INNER JOIN Q_Klager ON TblBureau.Sælgernr=Q_Klager.Sælger osv ...
Hvis jeg skal kalde en samlet SQL-string, uden at ændre på database-arkitekturen, hvordan skal det så se ud. Det der med at oprette midlertidige instanser af tabeller og felter er jeg ikke så bekendt med. Har søgt noget inden og er stødt på nogle af de andre svar du har givet, du er great man!, bare ikke noget der helt ramte mit problem on the money... :-)
Oprettelse af en forespørgsel ændrer ikke på database-arkitekturen. Det er bare en slags ekstra lag ovenpå.
Men ok, gør følgende: - Start med at oprette en udvælgelsesforespørgsel (Forespørgsler/Ny) - Vælg Designvisning og OK - Klik på tblklager, klik Tilføj og Luk - Træk stjernen i tabellen tblklager ned i forespørgselsgitteret - I feltet til højre for stjernen skriver du: Sælger: VAL(MID(tblklager.sælgernr,1,3)) - Gem forespørgslen som Q_Klager
Nu har du en forespørgsel, som er fuldstændig magen til din tblklager tabel - men udvidet med et ekstra numerisk felt (Sælger). Du kan fremover bruge Q_Klager i stedet for tblklager. Du kan rette, indsætte og slette - og du kan bruge den i SQL udtryk.
I din kode retter du derfor de første linier fra UPDATE TblBureau INNER JOIN tblklager ON TblBureau.Sælgernr=VAL(MID(tblklager.sælgernr,1,3)) til UPDATE TblBureau INNER JOIN Q_Klager ON TblBureau.Sælgernr=Q_Klager.Sælger
altså: du joiner nu med den nye forespørgsel via det nye (numeriske) felt.
Fandt selv ud af det, da der åbenbart ikke var mange gode ting at sige om funktionen val(). Derimod kom MID(tblklager.sælgernr,1,3) ind i et en NZ() og derefter ind i en CINT(). NZ bruges da der kan forekommer NULL. Egentlig kan man også bruge VAL(), men blev bare rådet fra det, måske en eller anden forbipasserende kan fortælle mig hvorfor (eller om det er "sikkert" ;D) Det NZ gør (til andre der er interesseret) er at returnere værdi1, hvis denne ikke er NULL, ellers værdi2, efter syntaxen (NZ(værdi1, værdi2). CINT() ændre blot værdien til en integer. Som sagt, i stedet for CINT() kan man også bruge VAL(), men blev dog ikke tilrådet dette.
Synes godt om
Ny brugerNybegynder
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.