Query hulp
Hallo,
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).
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).
AND tblKalenderpunt.werknemerId = tblWerknemers.werknemerId
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
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
Sorry ik heb nu even geen tijd om het te testen.
Maar ik zou proberen om het op te lossen met een outer join.
tabel en veld benamingen zou ik trouwens niet kamelcase doen!
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.
Mijn eerste idee was ook om per werknemer zo'n extra recordje toe te laten voegen (kan automatisch met 1 query gedaan worden, dus niet extra werk) maar dat loopt na een tijdje mis als er werknemers bij komen bijvoorbeeld.
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?)
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?)
Dan zal ik eens aan de slag gaan met Joins.
Ik heb het zo aangeleerd gekregen op school en blijven doen.
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
En de resulterende query is:
SELECT * FROM (tblKalenderpunt LEFT JOIN tblWerknemers ON tblKalenderpunt.werknemerId = tblWerknemers.werknemerId) LEFT JOIN tblKalenderType ON tblKalenderpunt.typeId = tblKalenderType.typeId WHERE tblKalenderpunt.dagId = 139
SELECT * FROM (tblKalenderpunt LEFT JOIN tblWerknemers ON tblKalenderpunt.werknemerId = tblWerknemers.werknemerId) LEFT JOIN tblKalenderType ON tblKalenderpunt.typeId = tblKalenderType.typeId WHERE tblKalenderpunt.dagId = 139
Doet die query nu wat je verlangde?
2 opmerkingen:
1) * ? laat gewoon die velden zoals het voordien was
2) waarom haakje rond tabellen?
2 opmerkingen:
1) * ? laat gewoon die velden zoals het voordien was
2) waarom haakje rond tabellen?
@Hipska: hij doet nu helemaal wat ik verlangde
Zonder de haakjes werd mijn query niet uitgevoerd.
Zonder de haakjes werd mijn query niet uitgevoerd.
Dat is vreemd...
Dus zoals ik hem plaatste doet hij het niet?
Wat geeft ie als foutmelding?
Dus zoals ik hem plaatste doet hij het niet?
Wat geeft ie als foutmelding?
Ik weet niet meer juist wat hij als foutmelding gaf, maar het hij zei iets over een fout in het FROM gedeelte.
Mss ook even bijvermelden dat het hier over een access database gaat.
Mss ook even bijvermelden dat het hier over een access database gaat.
Ah, Access SQL ken ik niet zo goed, maar zou niet veel mogen afwijken van standaard SQL.
Waarom moet die tweede JOIN dan niet tussen haakjes vraag ik mij dan af.
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?)




