Avatar billede sorenmt84 Juniormester
29. december 2007 - 17:51 Der er 15 kommentarer og
1 løsning

Sql hent fra tabel, med kriterier fra 2 tabeller

Jeg har denne SQL:

strSQL = "SELECT * FROM projekter WHERE slettet = false and cdate(dato_fra) = #" & dato_start & "# or cdate(dato_til) = #" & dato_start & "# and slettet = FALSE or cdate(dato_fra) <= #" & dato_start & "# and cdate(dato_til) >= #" & dato_start & "# and slettet = FALSE or cdate(dato_fra) >= #" & dato_start & "# and cdate(dato_til) <= #" & dato_slut & "# and slettet = FALSE order by dato_fra asc ;"

Jeg skal bruge en nyt sql, der har samme kriterier som ovenfor, men samtidig går ind i tabellen projekter_medarbejdre og tjekker at posten også opfylder kriteriet ref_medarb = Request.("id")
Avatar billede softspot Forsker
29. december 2007 - 18:02 #1
Jeg er lidt usikker på hvad du mener med at ref_medarb = Request.("id") (jeg antager du mener Request("id")), men umiddelbart burde det være nok bare at inner join'e, da projekter ikke vil fremgå af resultatet, hvis der ikke findes mindst en række i projekter_medarbejdere. Nogenlunde således:

strSQL = "SELECT p.* " & _
  "FROM projekter AS p " & _
  "INNER JOIN projekter_medarbejdere AS pm ON pm.ref_medarb = p.id " & _
  "WHERE p.slettet = false " & _
  "AND cdate(p.dato_fra) = #" & dato_start & "# " & _
  "OR cdate(p.dato_til) = #" & dato_start & "# " & _
  "AND p.slettet = FALSE " & _
  "OR cdate(p.dato_fra) <= #" & dato_start & "# " & _
  "AND cdate(p.dato_til) >= #" & dato_start & "# " & _
  "AND p.slettet = FALSE " & _
  "OR cdate(p.dato_fra) >= #" & dato_start & "# " & _
  "AND cdate(p.dato_til) <= #" & dato_slut & "# " & _
  "AND p.slettet = FALSE " & _
  "ORDER BY dato_fra ASC;"

Jeg synes dog dine AND'er og OR'er er lidt sporadiske og tvivler lidt på om du får det resultat du har til hensigt. Jeg kan i øvrigt anbefale dig at bruge BETWEEN til datointervaller i stedet for den benyttede konstruktion.
Avatar billede softspot Forsker
29. december 2007 - 18:05 #2
Hvis mit foreslag ikke er korrekt, må du lige fortælle lidt mere om de to tabeller (hvilke felter de indeholder og typerne heraf), samt hvad det er du ønsker at opnå med dine data.
Avatar billede sorenmt84 Juniormester
29. december 2007 - 20:21 #3
Der gik det så måske lige hurtigt nok... din sql virker som sådan fint nok, men det skal ikke være hvoer pm.ref_medarb = p.id med hvor pm.ref_medarb = Request.QueryString("id")

Jeg har prøvet denne:
  "INNER JOIN projekter_medarbejdere AS pm ON pm.ref_medarb = " & Request.QueryString("id") & " " & _

Men giver fejlen:
Microsoft JET Database Engine fejl '80040e14'

Joinudtrykket understøttes ikke.
Avatar billede softspot Forsker
29. december 2007 - 22:24 #4
OK, men så må du bare kunne sætte et check ind i where-delen på om p.id = request.querystring("id") - det burde give den samme effekt (idet jeg antager at ref_medarb er fremmednøglen i tabellen projekter_medarbejder der peger på id-kolonnen i projekter-tabellen)...

strSQL = "SELECT p.* " & _
  "FROM projekter AS p " & _
  "INNER JOIN projekter_medarbejdere AS pm ON pm.ref_medarb = p.id " & _
  "WHERE p.slettet = false " & _
  "AND cdate(p.dato_fra) = #" & dato_start & "# " & _
  "OR cdate(p.dato_til) = #" & dato_start & "# " & _
  "AND p.slettet = FALSE " & _
  "OR cdate(p.dato_fra) <= #" & dato_start & "# " & _
  "AND cdate(p.dato_til) >= #" & dato_start & "# " & _
  "AND p.slettet = FALSE " & _
  "OR cdate(p.dato_fra) >= #" & dato_start & "# " & _
  "AND cdate(p.dato_til) <= #" & dato_slut & "# " & _
  "AND p.slettet = FALSE " & _
  "AND p.id = " & Request.QueryString("id") & " " & _
  "ORDER BY dato_fra ASC;"
Avatar billede sorenmt84 Juniormester
30. december 2007 - 00:34 #5
Lige et lille tillægs spørgsmål,som jeg håber at du kan hjælpe mig videre med.. Ovenover min SQL, har jeg jo Set rs_projekt =  Server.CreateObject("ADODB.Recordset")

Således at jeg fra tabellen projekt kan hente et felt ud med rs_projekt("felt"), men jeg skal også bruge data fra et felt i projektere_medarbejdere... Har prøvet med pm.rs_projekt og bare pm mm. men kan ikke rigtig få det til at virke... Hvordan får jeg data derfra?
Avatar billede softspot Forsker
30. december 2007 - 01:32 #6
Det havde været lettere at give dig en konkret løsning, hvis du havde sagt hvilket felt det drejede sig om, men nu får du lige syntaksen for det, så kan du nok selv finde ud af at ændre feltnavnet :)

Således:

strSQL = "SELECT p.*, pm.felt " & _
  "FROM projekter AS p " & _
  "INNER JOIN projekter_medarbejdere AS pm ON pm.ref_medarb = p.id " & _
  "WHERE p.slettet = false " & _
  "AND cdate(p.dato_fra) = #" & dato_start & "# " & _
  "OR cdate(p.dato_til) = #" & dato_start & "# " & _
  "AND p.slettet = FALSE " & _
  "OR cdate(p.dato_fra) <= #" & dato_start & "# " & _
  "AND cdate(p.dato_til) >= #" & dato_start & "# " & _
  "AND p.slettet = FALSE " & _
  "OR cdate(p.dato_fra) >= #" & dato_start & "# " & _
  "AND cdate(p.dato_til) <= #" & dato_slut & "# " & _
  "AND p.slettet = FALSE " & _
  "AND p.id = " & Request.QueryString("id") & " " & _
  "ORDER BY dato_fra ASC;"


Altså i stedet for

SELECT p.*

så skriver du

SELECT p.*, pm.feltnavn
Avatar billede softspot Forsker
30. december 2007 - 01:36 #7
Du kunne også bare skrive

SELECT *

for at få alle felter fra alle de join'ede tabeller, men jeg er ikke tilhænger af den slags forespørgsler, da du ikke umiddelbart kan se på forespørgslen hvad der returneres og derfor skal have kendskab til tabellens opbygning for at vide hvad du har adgang til. Desuden vil du ofte blive straffet for den slags forespørgsler, fordi den typisk overfører for mange data ifht. det man har brug for, så det er en god idé at specificere de felter man har brug for (selvom det koster lidt mere at skrive, så mener jeg at man vinder noget ifht. læsbarheden af koden, hvilket man ikke skal negligere værdien af :-)).
Avatar billede sorenmt84 Juniormester
30. december 2007 - 23:19 #8
Jeg kan ikke helt få det til at virke...

Den jeg bruger nu, ser således ud:

Set rs_projekt =  Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT p.* " & _
  "FROM projekter AS p " & _
  "INNER JOIN projekter_medarbejdere AS pm ON pm.ref_projekt = p.id " & _
  "WHERE p.slettet = false " & _
  "AND cdate(pm.dato_fra) = #" & dato_start & "# " & _
  "AND pm.ref_medarb = " & Request.QueryString("id") & " " & _
  "OR cdate(pm.dato_til) = #" & dato_start & "# " & _
  "AND p.slettet = FALSE " & _
  "AND pm.ref_medarb = " & Request.QueryString("id") & " " & _ 
  "OR cdate(pm.dato_fra) <= #" & dato_start & "# " & _
  "AND cdate(pm.dato_til) >= #" & dato_start & "# " & _
  "AND p.slettet = FALSE " & _
  "AND pm.ref_medarb = " & Request.QueryString("id") & " " & _
  "OR cdate(pm.dato_fra) >= #" & dato_start & "# " & _
  "AND cdate(pm.dato_til) <= #" & dato_slut & "# " & _
  "AND p.slettet = FALSE " & _
  "AND pm.ref_medarb = " & Request.QueryString("id") & " " & _
  "ORDER BY pm.dato_fra ASC;"

Set rs_projekt = Conn.Execute(strSQL)

Det virker, men jeg kan kun hente data ud fra tabellen projekter (som jeg gør ved at skrive rs_projekt("felt")) - Hvordan kobler jeg projekter_medarbejdere på der og hvad skal jeg skrive for at hente et felt ud?
Avatar billede softspot Forsker
31. december 2007 - 01:06 #9
Kan du ikke prøve at vise hvilke tabeller du har behov for at hente data fra, hvilke felter de indeholder og hvilke felter der forbinder de forskellige tabeller? Jeg har lidt svært ved at gennemskue om du rent faktisk vil have involveret en tabel mere (altså således der er 3 tabeller i stedet for de 2 der er nu), eller om det er noget andet du er på jagt efter...
Avatar billede sorenmt84 Juniormester
31. december 2007 - 11:56 #10
Det prøver jeg her:

Tabel: Projekter (dette er min "hoved"tabel)
Felter: dato_fra, dato_til, projekt

Tabel: projekter_medarbejdere
Her skal jeg have alle de poster med fra hvor feltet ref_projekt, svarer til feltet id i tabellen projekter, samt at feltet ref_medarb svarer til Request.QueryString("id")
Felter: dato_fra, dato_til, ref_projekt, ref_medarb

Tabel: fravaer
Her skal jeg have alle de poster hvor ref_medarb svarer til Request.QueryString("id")  og tabellen er ikke bundet sammen med de 2 andre i form af id felter eller lign
Felter: dao_fra, dato_til, ref_medarb, fravaer
Avatar billede softspot Forsker
06. januar 2008 - 00:39 #11
Hmm... så prøv dette (den giver dig alle felter fra alle tre tabeller):

strSQL = "SELECT p.*, pm.*, f.* " & _
  "FROM projekter AS p " & _
  "INNER JOIN projekter_medarbejdere AS pm ON pm.ref_projekt = p.id " & _
  "INNER JOIN fravaer AS f ON f.ref_medarb = pm.ref_medarb " & _
  "WHERE p.slettet = false " & _
  "AND cdate(pm.dato_fra) = #" & dato_start & "# " & _
  "AND pm.ref_medarb = " & Request.QueryString("id") & " " & _
  "OR cdate(pm.dato_til) = #" & dato_start & "# " & _
  "AND p.slettet = FALSE " & _
  "AND pm.ref_medarb = " & Request.QueryString("id") & " " & _ 
  "OR cdate(pm.dato_fra) <= #" & dato_start & "# " & _
  "AND cdate(pm.dato_til) >= #" & dato_start & "# " & _
  "AND p.slettet = FALSE " & _
  "AND pm.ref_medarb = " & Request.QueryString("id") & " " & _
  "OR cdate(pm.dato_fra) >= #" & dato_start & "# " & _
  "AND cdate(pm.dato_til) <= #" & dato_slut & "# " & _
  "AND p.slettet = FALSE " & _
  "AND pm.ref_medarb = " & Request.QueryString("id") & " " & _
  "ORDER BY pm.dato_fra ASC;"
Avatar billede sorenmt84 Juniormester
06. januar 2008 - 22:00 #12
Får denne fejl:

Microsoft JET Database Engine fejl '80040e14'

Der er en syntaksfejl, fordi der mangler en operator. i forespørgselsudtrykket

I denne line:
  "INNER JOIN fravaer AS f ON f.ref_medarb = pm.ref_medarb " & _
Avatar billede softspot Forsker
06. januar 2008 - 22:21 #13
Jeg er da mere tilbøjelig til at tro at det er fordi der ikke er nogen værdi i Request.QueryString("id")... er du sikker på at der er det?
Avatar billede sorenmt84 Juniormester
07. januar 2008 - 00:06 #14
Jeg havde lavet en lille fejl... det virker som det skal nu... tak for hjælpen og tålmodigheden. vil du smide et svar
Avatar billede softspot Forsker
07. januar 2008 - 08:48 #15
Velbekomme :)
Avatar billede softspot Forsker
07. januar 2008 - 09:45 #16
Tak for point :)
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
Kurser inden for grundlæggende programmering

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