Toon posts:

[Paradox / SQL] Probleem met Subquery

Pagina: 1
Acties:

Verwijderd

Topicstarter
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:

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!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 26-05 00:01

Janoz

Moderator Devschuur®

!litemod

Kijk eens naar het HAVING keyword in SQL.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
HAVING is er toch voor om een voorwaarde op te leggen aan berekende velden. Wat zou ik dan als voorwaarde moeten geven??

Verwijderd

Topicstarter
Iemand nog tips??