[SQL] Tabellen koppelen en een subquery....probleempje

Pagina: 1
Acties:
  • 145 views sinds 30-01-2008
  • Reageer

  • -RenE-
  • Registratie: September 2001
  • Laatst online: 31-03 23:10
Tja, wederom een hersenkraker voor de SQL-guru's onder ons:

Ik probeer twee tabellen te koppelen met een left join. Tot dusver geen probleem. Echter tegelijkertijd probeer ik een subquery op een van de tabellen los te laten op een max. date te vinden. Op de een op andere manier gaat hier iets mis, want ik houd enkel inner join resultaten over.

Tabellen:

tblparticipant:
lab_id
module_id

bv:
192 4
192 5
192 6
192 7
192 8
194 1
194 2
194 3


tblresults_9
lab_id
dtm_insert

bv.
189 2005-09-12 10:28:52
192 2005-09-11 14:45:56
192 2005-09-12 15:36:54
194 2005-09-09 16:11:15
194 2005-09-09 16:12:29
196 2005-09-12 14:57:47

query:

Ik wil:

- Alle lab_id's van tblparticipant met module_id=4;
- Deze gekoppeld aan de lab_id van tabel tblresults_9
- Wanneer tblresults_9 twee of meer records heeft dan wil ik alleen degene met de laatste datum zien (laatste invoer).

Mijn idee:
code:
1
2
3
4
5
6
7
8
9
SELECT p.lab_id, 
    p.module_id, 
    tblresults_9.dtm_insert
FROM 
    tblparticipant p LEFT OUTER JOIN tblresults_9 ON p.lab_id = tblresults_9.lab_id
WHERE 
    p.module_id=4 AND
    dtm_insert = 
        (SELECT MAX(dtm_insert) FROM tblresults_9 WHERE lab_id=p.lab_id);


Dit gaat goed, maar geeft geen lab_id's uit tblparticipant, die niet in in tblresults_9 terugkomen. Geen left join dus.

Help...Wie heeft raad?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:31
Schrijf die filter-clause eens in je join clause:

code:
1
2
3
FROM p
LEFT OUTER JOIN results ON p.lab_id = results.lab_id AND dtm_insert = ( SELECT .... )
WHERE p.module_id = 4

https://fgheysels.github.io/


  • -RenE-
  • Registratie: September 2001
  • Laatst online: 31-03 23:10
SQL:
1
2
3
4
5
SELECT p.lab_id, 
    p.module_id, 
    tblresults_9.dtm_insert
FROM tblparticipant p LEFT OUTER JOIN tblresults_9 ON p.lab_id = tblresults_9.lab_id  AND dtm_insert = (SELECT MAX(dtm_insert) FROM tblresults_9 WHERE lab_id=p.lab_id)
WHERE p.module_id=4


Thx Whoami. Dat werkt inderdaad.

Zou je ook kunnen uitleggen waarom het werkt?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:31
AFAIK gaat het zo:

Eerst worden je JOIN clauses uitgevoerd, en daarna wordt er gefiltert.
Als je een LEFT OUTER join doet, voor een record die geen gerelateerde records heeft in de gejoinde tabel, dan worden er NULL waardes gereturned.
Als je dan daarna de WHERE uitvoert, dan wordt die NULL vergeleken met jouw WHERE criterium. Als het dus een NULL is, dan voldoet jouw filter-criterium niet, en wordt het record weggelaten.

Als je het echter in je JOIN clause doet, dan worden er ook geen records teruggevonden, maar aangezien het een LEFT JOIN is, wordt er een 'dummy record' gereturned met allemaal NULL values.

Beetje krom uitgelegd misschien...

https://fgheysels.github.io/


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

whoami schreef op dinsdag 27 september 2005 @ 15:19:
Beetje krom uitgelegd misschien...
Neehoor, ik kan je prima volgen! :7

* Varienaja heeft weer wat opgestoken.

Siditamentis astuentis pactum.


  • -RenE-
  • Registratie: September 2001
  • Laatst online: 31-03 23:10
whoami schreef op dinsdag 27 september 2005 @ 15:19:
Beetje krom uitgelegd misschien...
Ik vermoedde al zoiets, maar nu snap ik het ook.

Bedankt!
Pagina: 1