[SQL]Query moet melding of project weergeven...

Pagina: 1
Acties:

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
Ik ben bezig met een project voor het bijhouden van een urenregistratie. Ik heb hiervoor een aantal tabellen: tblprojecten,tblmeldingen en tbluren.

Allen hebben het unieke sleutelveld ID meegekregen. In de tabel uren heb ik o.a. de datum, starttijd,projectid,meldingsid,medewerker. Als er op een bepaald moment gewerkt is aan een project, staat in dit veld hetid van tblprojecten. Is er werk verricht op basis van een melding, dan staat hier het id van tblmeldingen. Het andere veld is dan leeg (NULL).

Nu wil ik een query bouwen die alle urenregistraties laat zien in een bepaalde periode, bv 25/5. Echter zie ik wel de gegevens van de projecten 1 maal, maar de meldingen komen 4 maal terug (ik heb op dit moment 4 PROJECTEN in de database staan).

Mijn query ziet er zo uit:
code:
1
2
3
4
5
6
7
8
SELECT tbluren.*, tblprojecten.projectnummer,tblwerkbonnen.bonnummer, 
tblrelaties.bedrijfsnaam,  tblwerknemers.* 
From tbluren, tblprojecten, tblwerknemers, tblwerkbonnen, tblrelaties 
WHERE gebruikersid=tblwerknemers.id AND 
tblwerknemers.id=1AND 
(tblprojecten.id=tbluren.project OR tbluren.werkbon=tblwerkbonnen.id) AND 
tblrelaties.id = tbluren.relatieid AND 
datum=#2004-05-25#


Wat doe ik verkeerd. Ik wil dus ook de melding maar 1 maal terug zien.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Ik denk dat het hier zit:
SQL:
1
(tblprojecten.id=tbluren.project OR tbluren.werkbon=tblwerkbonnen.id)

Als het deel achter die OR waar is, dan wil dat zeggen dat het niet uit maakt wat het resultaat van de eerste expressie is. Misschien dat je wat beters bereikt door DISTINCT te gebruiken, of achteraan een GROUP BY tblprojecten.id toe te voegen. Het zit iig in de code die ik hierboven aanhaalde volgens mij.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
heeft het zin als ik m.b.t. dit probleem eens kritisch naar het gebruik van joins ga kijken ?

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
NMe84 schreef op 25 mei 2004 @ 20:38:
Ik denk dat het hier zit:
SQL:
1
(tblprojecten.id=tbluren.project OR tbluren.werkbon=tblwerkbonnen.id)

Als het deel achter die OR waar is, dan wil dat zeggen dat het niet uit maakt wat het resultaat van de eerste expressie is.
er kan maar 1 van de 2 gevuld zijn

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
is dit uberhaupt wel mogelijk, een query opbouwen op basis van een if/statemant, want dat is het eigenlijk.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:56
Je legt je join conditities wel, maar je OR'ed ze. Dat moet dus een AND worden.
Door die OR krijg je een cartesiaans product.

Door een OUTER JOIN op tblUren te doen, en een AND te gebruiken moet het wel lukken.

code:
1
2
3
4
SELECT 
FROM tblUren
LEFT JOIN tblProjecten ON tblUren.projectId = tblProjecten.Projectid
LEFT JOIN tblWerkbon ON tblWerkbon.werkbonId = tblUren.WerkbonId

[ Voor 44% gewijzigd door whoami op 26-05-2004 19:40 ]

https://fgheysels.github.io/


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

pkouwer schreef op 25 mei 2004 @ 21:02:
heeft het zin als ik m.b.t. dit probleem eens kritisch naar het gebruik van joins ga kijken ?
Goed plan! :P In je query zie ik nu helemaal geen joins staan, wat betekent dat de query eerst een cartesiaans product opbouwt van alle mogelijke combinaties van alle records in de tabellen met alle records in de andere tabellen, om ze daarna eens te filteren. Niet helemaal de manier :Y)


edit:
dus wel

[ Voor 25% gewijzigd door Lustucru op 26-05-2004 20:02 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:56
Niesje schreef op 26 mei 2004 @ 19:44:
[...]

Goed plan! :P In je query zie ik nu helemaal geen joins staan, wat betekent dat de query eerst een cartesiaans product opbouwt
Nee, het is niet omdat hij het JOIN keyword niet gebruikt, dat hij daarvoor geen joins gebruikt.
Je kan evengoed perfect joinen door de relaties / joins in de WHERE clausule aan te geven (wat de topicstarter nu dus gedaan heeft).

https://fgheysels.github.io/


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
newbie op het gebied van joins...

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

whoami schreef op 26 mei 2004 @ 19:46:
[...]

Nee, het is niet omdat hij het JOIN keyword niet gebruikt, dat hij daarvoor geen joins gebruikt.
Je kan evengoed perfect joinen door de relaties / joins in de WHERE clausule aan te geven (wat de topicstarter nu dus gedaan heeft).
Oops, helemaal verkeerd gelezen en niet nagedacht...

Maar waarom zou je jet JOIN keyword niet gebruiken?

[ Voor 11% gewijzigd door Lustucru op 26-05-2004 20:04 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
ik heb nu dit:

code:
1
2
3
SELECT *
FROM tblUren LEFT JOIN tblprojecten ON tbluren.project = 
tblProjecten.id LEFT JOIN tblwerkbon ON tblWerkbon.id = tblUren.werkbon

maar ik krijg een syntax-melding, gebaseerd op de eerste tblprojecten. Als ik de tweede LEFT JOIN weglaat, zie ik wel resultaat. tabelnamen zijn dus in orde

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:56
Welke fout krijg je dan?

https://fgheysels.github.io/


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
syntaxfout (operator ontbreekt) in query-expressie tbluren.project=tblprojecten.id LEFT JOIN tblwerkbonnen ON tblwerkbonnen.id=tbluren.werkbon

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Access dus? Haakjes om het eerste deel van de join wil nog wel eens helpen.
code:
1
2
FROM (tblUren LEFT JOIN tblprojecten ON tbluren.project = tblProjecten.id)
 LEFT JOIN tblwerkbon ON tblWerkbon.id = tblUren.werkbon

offtopic:
Iets minder snel je conclusies trekken mag ook wel

[ Voor 17% gewijzigd door Lustucru op 26-05-2004 20:56 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
Niesje schreef op 26 mei 2004 @ 20:54:

offtopic:
Iets minder snel je conclusies trekken mag ook wel
verklaar je nader ?
Pagina: 1