Avatar billede musicchart.dk Nybegynder
26. marts 2006 - 19:14 Der er 4 kommentarer og
1 løsning

SQL og JOIN

Jeg må indrømme at JOIN ikke er min aller stærkeste side.

I nedenstående kode, henter jeg nogle telefon numre ud fra en database, men det er altså lavet med 3 løkker inde i hinanden, hvilket ikke er helt hensigtsmæssigt. Kan dette laves mere optimeret ved brug af JOIN, og hvis - hvordan?

Set rsMelding = Conn.Execute("Select * FROM meldinger WHERE id = " & meldingID)
Set rsOrdre = Conn.Execute("Select * FROM ordre WHERE betalt = 1 AND aktivt = 1 AND slettet = 0")

Do while not rsOrdre.eof
  response.Write("ORDRE: " & rsOrdre("kundeID") & "<br>")
  Set rsDaekning = Conn.Execute("Select * FROM daekning WHERE gruppe = " & rsOrdre("daekning") & " AND kommune = " & rsMelding("kommune") & " AND kundeID = " & rsOrdre("kundeID"))
    Do while not rsDaekning.eof
    response.Write("DÆKNING: " & rsDaekning("kundeID") & "<br>")
    Set rsTider = Conn.Execute("Select * FROM tider WHERE (periode = 1 OR periode = " & periode & ") AND gruppe = " & rsDaekning("gruppe") & " AND (CURTIME() BETWEEN TIME(frakl) AND TIME(tilkl)) AND kundeID = " & rsDaekning("kundeID"))
    Do while not rsTider.eof
      response.Write("TIDER: " & rsTider("kundeID") & "<br>")
      numre = numre & rsTider("kundeID") & ","
    rsTider.movenext
    Loop   
  rsDaekning.movenext
  Loop
rsOrdre.movenext
Loop

Hilsen,
Bjarke
Avatar billede musicchart.dk Nybegynder
26. marts 2006 - 19:16 #1
Der var sådan set lidt overflødig kode der, jeg brugte til test:

Set rsMelding = Conn.Execute("Select * FROM meldinger WHERE id = " & meldingID)
Set rsOrdre = Conn.Execute("Select * FROM ordre WHERE betalt = 1 AND aktivt = 1 AND slettet = 0")

Do while not rsOrdre.eof
  Set rsDaekning = Conn.Execute("Select * FROM daekning WHERE gruppe = " & rsOrdre("daekning") & " AND kommune = " & rsMelding("kommune") & " AND kundeID = " & rsOrdre("kundeID"))
    Do while not rsDaekning.eof
    Set rsTider = Conn.Execute("Select * FROM tider WHERE (periode = 1 OR periode = " & periode & ") AND gruppe = " & rsDaekning("gruppe") & " AND (CURTIME() BETWEEN TIME(frakl) AND TIME(tilkl)) AND kundeID = " & rsDaekning("kundeID"))
    Do while not rsTider.eof
      numre = numre & rsTider("kundeID") & ","
    rsTider.movenext
    Loop   
  rsDaekning.movenext
  Loop
rsOrdre.movenext
Loop
Avatar billede eagleeye Praktikant
26. marts 2006 - 19:41 #2
Du kommer nok ud sådan noget som dette:


SQL = "SELECT tider.kundeid FROM ((tider INNER JOIN daekning ON "
SQL = SQL & "(tider.gruppe = daekning.gruppe) AND (tider.kundeid = daekning.kundeID)) "
SQL = SQL & "INNER JOIN ordre ON (daekning.gruppe = ordre.daekning) AND (daekning.kundeID = ordre.kundeID)) "
SQL = SQL & "INNER JOIN meldinger ON daekning.kommune = meldinger.kommune "
SQL = SQL & "WHERE (tider.periode = 1 OR tider.periode = " & periode & ") AND "
SQL = SQL & "(CURTIME() BETWEEN TIME(tider.frakl) AND TIME(tider.tilkl)) AND "
SQL = SQL & "ordre.betalt = 1 AND ordre.aktivt = 1 AND ordre.slettet = 0 AND "
SQL = SQL & "meldinger.id = " & meldingID

Set rsTider = Conn.Execute(SQL)
Do while not rsTider.eof
  numre = numre & rsTider("kundeID") & ","
  rsTider.movenext
Loop



Dog ser det ud som om der er flere ens led blandet andet kundeID i flere tabellerne måske de kan undværes..
Avatar billede eagleeye Praktikant
26. marts 2006 - 19:42 #3
hmm jeg skal lige smutte et par timer...
Avatar billede musicchart.dk Nybegynder
26. marts 2006 - 19:59 #4
Hey eagleeye >> det ser ud til at virke perfekt. Og skulle gerne performe bedre end mine 3 løkker.
Avatar billede eagleeye Praktikant
26. marts 2006 - 21:25 #5
ok, så kommer der da lige et svar :)

Ja de skulle gerne være bedre, om ikke andet slår man kun op en gang i database frem for X'antal gange.
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