Hallo mensen,
Voor mijn stageopdracht moet ik een programma maken dat een SQL Query genereert vanuit de keuzemogelijkheden in een User Interface. In het programma wordt er een string gevuld met een Query en deze wordt ingeladen in een Tquery component die weer wordt weergegeven in een Grid. Dit gaat voor heel veel Querys goed, maar de problemen komen wanneer ik subquerys wil gaan gebruiken. Het laden van de gegevens wordt opeens supertraag en in de ergste gevallen blijft het programma hangen. Het probleem heeft niet met de Query componenten te maken, want bij Database Desktop en SQL Explorer doet het probleem zich ook voor. Het gebruiken van meerdere Query componenten en deze combineren is niet mogelijk, ik moet één Query hebben.
De database waar de gegevens uitgehaald moeten worden is een Paradox Database. Hieronder probeer ik een simpel voorbeeld te geven wat misgaat:
Tabel A: 849 rijen [ID, Naam]
Tabel B: 27870 rijen [ID, cijfer, datum]
Wanneer alle laatste data wil hebben die bij een bepaalde naam horen krijg ik (ongeveer) de volgende query:
Dit gaat helemaal goed, maar zodra we een ander attribuut van tabel B toevoegen die GEEN MAX functie bevat krijg ik resultaten die ik niet wil:
Ik krijg nu per naam ALLE Cijfers en de datum die erbij hoort. (aparte rijen)
Dat komt vast door de Group By, want ik wordt verplicht om op alle velden waar geen functie op staat te groeperen, maar ik wil niet groeperen op B.Cijfer!!!
Als oplossing heb ik dus een subquery bedacht:
Als ik in de where een voorwaarde zet zoals “naam = <unieke naam>”, dan lukt het WEL om de Query te laden, maar dit werkt ontzettend traag (en dan heb ik nog maar één Naam geladen, laat staan wanneer ik ALLE namen uit tabel A wil gaan laden - 849 rijen).
Ik heb het met verschillende collegas besproken, maar ook zij kwamen er niet uit. Ik heb al veel dingen geprobeerd (ook joins), maar ik kan geen oplossing vinden. En de beperkte opties van BDE/Paradox helpen ook niet echt mee. Het stomste is nog wel dat de subquery en de hoofdquery afzondelijk gewoon snel laden, maar de combinatie trekt hij gewoon niet.
Alle hulp is welkom!
Voor mijn stageopdracht moet ik een programma maken dat een SQL Query genereert vanuit de keuzemogelijkheden in een User Interface. In het programma wordt er een string gevuld met een Query en deze wordt ingeladen in een Tquery component die weer wordt weergegeven in een Grid. Dit gaat voor heel veel Querys goed, maar de problemen komen wanneer ik subquerys wil gaan gebruiken. Het laden van de gegevens wordt opeens supertraag en in de ergste gevallen blijft het programma hangen. Het probleem heeft niet met de Query componenten te maken, want bij Database Desktop en SQL Explorer doet het probleem zich ook voor. Het gebruiken van meerdere Query componenten en deze combineren is niet mogelijk, ik moet één Query hebben.
De database waar de gegevens uitgehaald moeten worden is een Paradox Database. Hieronder probeer ik een simpel voorbeeld te geven wat misgaat:
Tabel A: 849 rijen [ID, Naam]
Tabel B: 27870 rijen [ID, cijfer, datum]
Wanneer alle laatste data wil hebben die bij een bepaalde naam horen krijg ik (ongeveer) de volgende query:
code:
1
2
3
4
5
| SELECT A.Naam, MAX(B.datum) FROM tabelA A , tabelB B WHERE (A.Id = B.Id) GROUP BY A.Naam ORDER BY A.Naam ASC |
Dit gaat helemaal goed, maar zodra we een ander attribuut van tabel B toevoegen die GEEN MAX functie bevat krijg ik resultaten die ik niet wil:
code:
1
2
3
4
5
| SELECT A.Naam, B.Cijfer, MAX(B.datum) FROM tabelA A , tabelB B WHERE (A.Id = B.Id) GROUP BY A.Naam, B.Cijfer ORDER BY A.Naam ASC, B.Cijfer ASC |
Ik krijg nu per naam ALLE Cijfers en de datum die erbij hoort. (aparte rijen)
Dat komt vast door de Group By, want ik wordt verplicht om op alle velden waar geen functie op staat te groeperen, maar ik wil niet groeperen op B.Cijfer!!!
Als oplossing heb ik dus een subquery bedacht:
code:
1
2
3
4
5
6
7
8
| SELECT A.Naam, B.Cijfer, MAX(B.datum)
FROM tabelA A , tabelB B
WHERE (A.Id = B.Id)
and B.datum in (SELECT MAX(C.datum)
FROM tabelB C
WHERE C.Id = A.Id)
GROUP BY A.Naam, B.Cijfer
ORDER BY A.Naam ASC, B.Cijfer ASC |
Als ik in de where een voorwaarde zet zoals “naam = <unieke naam>”, dan lukt het WEL om de Query te laden, maar dit werkt ontzettend traag (en dan heb ik nog maar één Naam geladen, laat staan wanneer ik ALLE namen uit tabel A wil gaan laden - 849 rijen).
Ik heb het met verschillende collegas besproken, maar ook zij kwamen er niet uit. Ik heb al veel dingen geprobeerd (ook joins), maar ik kan geen oplossing vinden. En de beperkte opties van BDE/Paradox helpen ook niet echt mee. Het stomste is nog wel dat de subquery en de hoofdquery afzondelijk gewoon snel laden, maar de combinatie trekt hij gewoon niet.
Alle hulp is welkom!