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