|
| SQL --> INNERJOIN --> Problem (VB5) Fra : L. Hansen |
Dato : 16-02-02 22:40 |
|
Hej
Følgende kode benyttes via ODBC til at udføre et træk fra en AS/400
Database.
Jeg bruger VB5 Enterprise og RDO.
<kode>
sSQL = "select * from FAKTH1 where F_STAT =" & 10 & " AND F_KODE =" & "'" &
"O" & "'" & " AND F_KAT =" & "'" & "V" & "'"
Set Rs_RDO = Db.OpenResultset(sSQL, rdOpenDynamic)
Do While Not Rs_RDO.EOF
Nu finder den fx. 150 records, der opfylder betingelserne.
Jeg indlæser 3 oplysninger, bl.a. FAKTNR som lægges i lngFAKNR, fra
headeren FAKTH1.
Herefter skal jeg så gennemløbe oprettede linier, hvis der ER oprettet
linier:
sSQL2 = "select * from FAKTLP1 where FAKTNR =" & lngFAKNR
Set Rs_RDO2 = Db.OpenResultset(sSQL2, rdOpenDynamic)
While Not Rs_RDO2.EOF
Her indlæses linie for linie og der sammentælles (sum)
Wend
Rs_RDO.MoveNext
Loop
<..kode>
Der findes ca. 25.000 records ialt, hvor der er ca. 150 records der matcher.
(sSQL)
Heraf har kun ca. 25 oprettet linier.(sSQL2)
Udkommenterer jeg SQL-trækket 'sSQL2' - så har den udført trækket på ca. 6
sek.
Medtager jeg trækket SQL-trækket 'sSQL2' - så er den 5 minutter om det.
....
Er der en i NG'en der kan gennemskue problemet ?
Jeg har tænkt på et 'kombineret' SQL-træk med JOIN (INNERJOIN), men er det
ikke problematisk,
når fundne record risikere ikke at have nogen linier oprettet ?
Håber på svar. På forhånd tak.
Mvh, L. Hansen
webmaster@dancar.dk
| |
Tomas Christiansen (17-02-2002)
| Kommentar Fra : Tomas Christiansen |
Dato : 17-02-02 00:15 |
|
L. Hansen skrev:
> While Not Rs_RDO2.EOF
> Her indlæses linie for linie og der sammentælles (sum)
> Wend
Hvis det blot er en sammentællgin, som du har brug for, har du så
overvejet at lade SQL foretage sammentællingen i stedet - det plejer
at gå RET hurtigt!
Eksempel: SELECT SUM(BELOEB) FROM INDBETAL
-------
Tomas
| |
L. Hansen (17-02-2002)
| Kommentar Fra : L. Hansen |
Dato : 17-02-02 08:54 |
|
"Tomas Christiansen" <toc@blikroer.removethis.dk> skrev i en meddelelse
news:a4mp63$2398$1@news.cybercity.dk...
> Hvis det blot er en sammentællgin, som du har brug for, har du så
> overvejet at lade SQL foretage sammentællingen i stedet - det plejer
> at gå RET hurtigt!
>
> Eksempel: SELECT SUM(BELOEB) FROM INDBETAL
>
> -------
> Tomas
>
Hej
Desværre skal jeg også bruge oplysninger fra 3 andre felter.
Men har du nogen kommentarer til et forbedret SQL-træk ?
Mvh, Lennart
webmaster@dancar.dk
| |
Tomas Christiansen (17-02-2002)
| Kommentar Fra : Tomas Christiansen |
Dato : 17-02-02 12:32 |
|
L. Hansen skrev:
> Desværre skal jeg også bruge oplysninger fra 3 andre felter.
> Men har du nogen kommentarer til et forbedret SQL-træk ?
Umiddelbart ikke andet end at ud fra mine erfaringer med Oracle 8i,
ADO og VB 6.0, går dine læsninger i database UMÅDELIG langsomt!
-------
Tomas
| |
Rayman (17-02-2002)
| Kommentar Fra : Rayman |
Dato : 17-02-02 16:59 |
|
Mit forslag er sådan:
SELECT * FROM [FAKTH1] INNER JOIN [FAKTLP1] ON [FAKTH1].[FAKTNO] =
[FAKTLP1].[FAKTNO] WHERE [FAKTH1].[F_STAT] = " .....
osv.
Her medtages jo selvfølgelig kun records, fra fakth1, hvor der er linier i
faktlp, men du kan jo ogaå vælge et RIGHT JOIN, og du får så bare NULL i de
felter som ikke eksisterer, hvis det er et problem, kan du måske bruge
IIf()...
Håber det hjælper lidt...
Mvh Rayman
"L. Hansen" <webmaster@dancar.dk> wrote in message
news:3c6ed192$0$89066$edfadb0f@dspool01.news.tele.dk...
> Hej
>
> Følgende kode benyttes via ODBC til at udføre et træk fra en AS/400
> Database.
> Jeg bruger VB5 Enterprise og RDO.
>
> <kode>
> sSQL = "select * from FAKTH1 where F_STAT =" & 10 & " AND F_KODE =" & "'"
&
> "O" & "'" & " AND F_KAT =" & "'" & "V" & "'"
> Set Rs_RDO = Db.OpenResultset(sSQL, rdOpenDynamic)
> Do While Not Rs_RDO.EOF
>
> Nu finder den fx. 150 records, der opfylder betingelserne.
> Jeg indlæser 3 oplysninger, bl.a. FAKTNR som lægges i lngFAKNR, fra
> headeren FAKTH1.
> Herefter skal jeg så gennemløbe oprettede linier, hvis der ER oprettet
> linier:
>
> sSQL2 = "select * from FAKTLP1 where FAKTNR =" & lngFAKNR
> Set Rs_RDO2 = Db.OpenResultset(sSQL2, rdOpenDynamic)
> While Not Rs_RDO2.EOF
> Her indlæses linie for linie og der sammentælles (sum)
> Wend
>
> Rs_RDO.MoveNext
> Loop
> <..kode>
>
> Der findes ca. 25.000 records ialt, hvor der er ca. 150 records der
matcher.
> (sSQL)
> Heraf har kun ca. 25 oprettet linier.(sSQL2)
> Udkommenterer jeg SQL-trækket 'sSQL2' - så har den udført trækket på ca. 6
> sek.
> Medtager jeg trækket SQL-trækket 'sSQL2' - så er den 5 minutter om det.
> ...
> Er der en i NG'en der kan gennemskue problemet ?
> Jeg har tænkt på et 'kombineret' SQL-træk med JOIN (INNERJOIN), men er det
> ikke problematisk,
> når fundne record risikere ikke at have nogen linier oprettet ?
>
> Håber på svar. På forhånd tak.
>
> Mvh, L. Hansen
> webmaster@dancar.dk
>
>
| |
Tomas Christiansen (17-02-2002)
| Kommentar Fra : Tomas Christiansen |
Dato : 17-02-02 22:13 |
|
L. Hansen skrev:
> sSQL = "select * from FAKTH1 where F_STAT =" & 10 & " AND F_KODE ="
& "'" &
> "O" & "'" & " AND F_KAT =" & "'" & "V" & "'"
> Set Rs_RDO = Db.OpenResultset(sSQL, rdOpenDynamic)
....
> sSQL2 = "select * from FAKTLP1 where FAKTNR =" & lngFAKNR
> Set Rs_RDO2 = Db.OpenResultset(sSQL2, rdOpenDynamic)
Jeg kom til at tænke på, at du jo ret beset kan klare det hele i to
forespørgsler (altså to forskellige forspørgsler, som hver bliver
udført netop én gang hver).
Du kan hente dine primære oplysninger fra forespørgslen:
sSQL = "select * from FAKTH1 where F_STAT =" & 10 & " AND F_KODE =" &
"'" & _
"O" & "'" & " AND F_KAT =" & "'" & "V" & "'"
Jeg ville nu nok være at skrive den således (det er eddermandme svært
at læse med alle de ekstra-anførselstegn og unødvendige
streng-konkateneringer, som du foretager). Jeg har dog "knækket"
linien af hensyn til læsevenligheden i nyhedslæserprogrammet:
sSQL = "select * from FAKTH1 where F_STAT =10" & _
" and F_KODE ='O' and F_KAT ='V'"
Dine sekundære data vil du kunne hente fra denne forespørgsel:
sSQL2 = "select * from FAKTLP1 L where exists" & _
" (select * from FAKTH1 H where" & _
" H.F_STAT =10 and H.F_KODE ='O' and H.FAKNR=L.FAKNR)"
Du er nu nødt til at løbe resultatet af sSQL-forespørgslen igennem i
en løkke, og for hver post, skal du checke om FAKNR læst fra
sSQL-forespørgslen er det samme som FAKNR læst fra
sSQL2-forespørgslen.
Er dette tilfældet, er der altså linier til dette FAKNR - de læses nu
fra sSQL2-forespørgslen, indtil et nyt FAKNR dukker op.
Er det IKKE tilfældet, er der altså INGEN linier til dette FAKNR -
hvad du gør ved dette ved jeg jo ikke.
Nu læses igen en ny post fra sSQL-forespørgslen, og det hele gentager
sig, indtil alle poster i sSQL-forespørgslen er behandlet. Nu vil
(bør/skal/må) alle poster i sSQL2-forespørgslen dermed også være
behandlet.
Håber at det er forståeligt, ellers må du vende tilbage.
-------
Tomas
| |
|
|