Query hulp
Ik zit met een query probleem!
mijn tabellen
*tblwerknemers
-werknemerId
-naam
*tblKalenderType
-typeId
-type
*tblKalenderpunt
-kalenderpuntId
-dagId
-werknemerId
-typeId
-information
Ik zit met het volgende:
Als mijn kalendertype feestdag is, dan is deze op iedereen van toepassing en staat mijn werknemerId in tblKalenderpunt op 0, deze werknemer bestaat dus niet en dat zorgt voor moeilijkheden bij het ophalen van "naam", "type" en "information". Momenteel beschik ik over volgende query.
"SELECT tblKalenderType.type, tblWerknemers.naam, tblKalenderpunt.information, tblKalenderpunt.kalenderpuntId FROM tblWerknemers, tblKalenderpunt, tblKalenderType WHERE tblKalenderpunt.dagId = 193 AND tblKalenderpunt.werknemerId = tblWerknemers.werknemerId AND tblKalenderpunt.typeId = tblKalenderType.typeId"
Bij uitvoeren van deze query zitten mijn feestdagen dus niet in het resultaat omdat hier geen werknemer voor bestaat.
Weet iemand hoe ik dit kan oplossen? (liefst op basis van de query).
veranderen in
AND (tblKalenderpunt.werknemerId = tblWerknemers.werknemerId OR tblKalenderpunt.werknemerId IS NULL)
ipv de IS NULL kan je ook = '' doen, dit hangt er maar net vanaf hoe je het opslaat in de database
Maar ik zou proberen om het op te lossen met een outer join.
tabel en veld benamingen zou ik trouwens niet kamelcase doen!
oplossen moet inderdaad met een outer-join. Je krijgt dan ook de records met feestdagen in het resultaat. Ik heb geen voorbeeld voor je omdat ik in MySQL sql nog geen outer joins heb gebouwd (wel in oracle sql maar dat werkt niet in mysql....)
@Johan: Dit biedt geen oplossing omdat je dan gewoon voor elke werknemer een record krijgt, terwijl je er eigenlijk maar 1 moet hebben waar geen werknemer in vermeld staat.
Vervolgens raad ik je aan om met JOIN te gaan werken ipv die AND telkens bij de WHERE. Het zal je query veel overzichtelijker houden en het kan een oplossing bieden net als Spike Spade zegt dmv een outer join of iets dergelijks toe te passen. Als je dit doet, dan zal bij de velden waar geen link is naar een werknemer (staat op NULL, ik zou niet opteren voor 0 want dat kan ook een ID zijn) het veld tbwerknemers.naam NULL zijn.
(waarom trouwens tbl ervoor? Het IS toch al een table? Kan je het verwarren met iets anders dan?)
Hipska BE op 30/07/2010 10:35:50:
(waarom trouwens tbl ervoor? Het IS toch al een table? Kan je het verwarren met iets anders dan?)
Ik heb het zo aangeleerd gekregen op school en blijven doen.
Nooit dingen doen die men je aanleert op school qua programmeerstijl :p
SELECT * FROM (tblKalenderpunt LEFT JOIN tblWerknemers ON tblKalenderpunt.werknemerId = tblWerknemers.werknemerId) LEFT JOIN tblKalenderType ON tblKalenderpunt.typeId = tblKalenderType.typeId WHERE tblKalenderpunt.dagId = 139
2 opmerkingen:
1) * ? laat gewoon die velden zoals het voordien was
2) waarom haakje rond tabellen?
Zonder de haakjes werd mijn query niet uitgevoerd.
Dus zoals ik hem plaatste doet hij het niet?
Wat geeft ie als foutmelding?
Mss ook even bijvermelden dat het hier over een access database gaat.
Waarom moet die tweede JOIN dan niet tussen haakjes vraag ik mij dan af.
Ik vind het er zo ook vreemd uit zien, maar had een voorbeeldje gevonden op het net en het werkt. Dus ik ben tevreden. (Moet jij trouwens niet aan het werk zijn?)