[MS Access] Union van join en niet-join

Pagina: 1
Acties:

  • Aesculapius
  • Registratie: Juni 2001
  • Laatst online: 21-04 19:55
Ik zit met een probleem in Access wat ik met got-search en google niet opgelost krijg...
Het volgende is het geval:

drie tabellen om een n-op-m relatie vast te leggen (voor de duidelijkheid even alleen de primary's en foreign's):
code:
1
2
3
Persoon - id
kpl_vaccinatie - id, vacinatieId, persoonId
Vacinaties - id

Het idee lijkt me duidelijk, een persoon kan meerdere vaccinaties hebben en een vaccinaties kan bij meerdere personen horen...tot zo ver niks vreemds...
Nu heeft de tabel Vaccinaties een kolom "verplicht". Wat ik wil hebben is een query die mij geeft:

alle personen die een koppeling met vaccinatie hebben waarbij de datum+werkingsduur verlopen is, dat is gelukt:
code:
1
2
3
SELECT K.datum, V.naam, V.werkingsduur, P.*
FROM (Persoon AS P LEFT JOIN kpl_vaccinatie AS K ON K.pid=P.id) LEFT JOIN Vacinaties AS V ON V.vacinatiesId=K.vacinatiesId
WHERE ((Now()>DateValue(DateAdd("m",V.werkingsduur,K.datum))) And V.werkingsduur>'0') And V.verplicht=True;

en
alle personen waarvan géén koppeling bestaat tussen hen en een verplichte vaccinatie.

M.a.w. Alle personen die aandacht nodig hebben :) Als een persoon voor 4 verplichte vaccinaties geen join heeft mag hij dus ook gerust 4 keer terug komen in de query...
Deze laatste is een probleem. Ik dacht eerst aan een FULL outer join (die in access trouwens niet eens mogelijk lijkt) maar daar ben ik niet helemaal van overtuigd... moet ik het wellicht met subqueries doen of vraag ik hier iets dat nou eenmaal niet kan?

Wie helpt?

[ Voor 21% gewijzigd door Aesculapius op 11-12-2005 21:28 . Reden: Eerste query even als toelichting geplaatst ]

Zeg wat je doet en doe wat je zegt, dan wordt de hele wereld een stukje leuker


  • Boss
  • Registratie: September 1999
  • Laatst online: 10:49

Boss

+1 Overgewaardeerd

Wat je zelf al in je titel hebt staan, met een UNION zou dit wel moeten lukken. Ik kan zo snel geen query bedenken die het in 1x kan doen in ieder geval.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • Aesculapius
  • Registratie: Juni 2001
  • Laatst online: 21-04 19:55
Okeej, van mijn part in twee stappen dan, maar hoe ziet die tweede query eruit? Ik zit een beetje vast :S

Zeg wat je doet en doe wat je zegt, dan wordt de hele wereld een stukje leuker


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Je kunt bijvoorbeeld een cartesisch product van personen en vaccinaties die verplicht zijn maken met een not exists richting je koppeltabel.

Who is John Galt?


  • Aesculapius
  • Registratie: Juni 2001
  • Laatst online: 21-04 19:55
Hmz, dat klinkt interessant; zou je daar een simpel voorbeeldje bij kunnen geven? De terminologie cartesisch product ontgaat mij even :)

Zeg wat je doet en doe wat je zegt, dan wordt de hele wereld een stukje leuker


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Het is eigenlijk een join zonder conditie, zie: P&W FAQ - SQL

Who is John Galt?


  • Aesculapius
  • Registratie: Juni 2001
  • Laatst online: 21-04 19:55
Dank :) Heb em met een UNION gedaan en kan nu weer lekker verder :)

code:
1
2
3
4
5
6
7
SELECT '' AS Datum,V.naam, V.werkingsduur, P.*
FROM Persoon AS P, Vaccinaties AS V
WHERE (((P.id) Not In (SELECT P.id FROM Persoon P INNER JOIN kpl_vaccinatie K ON K.pid = P.id))) AND V.verplicht=true

UNION ALL SELECT K.datum AS Datum, V.naam, V.werkingsduur, P.*
FROM (Persoon AS P LEFT JOIN kpl_vaccinatie AS K ON K.pid=P.id) LEFT JOIN Vaccinaties AS V ON V.vaccinatiesId=K.vaccinatiesId
WHERE ((Now()>DateValue(DateAdd("m",V.werkingsduur,K.datum))) And V.werkingsduur>'0') And V.verplicht=True;

[ Voor 16% gewijzigd door Aesculapius op 11-12-2005 23:30 . Reden: goeie code geplakt :) ]

Zeg wat je doet en doe wat je zegt, dan wordt de hele wereld een stukje leuker

Pagina: 1