SQL select query

Pagina: 1
Acties:

  • n3ck
  • Registratie: Mei 2002
  • Laatst online: 24-07-2025
Ik ben nu al een tijdje aan het prutsen met het volgende probleem:

De database (de echte bevat uiteraard meer items)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
INSERT INTO `huizen` (`id`, `straat`, `nummer`, `postcode`, `stad`) VALUES 
('1', 'A-straat', '2', '1234ab', 'Groningen'); 

INSERT INTO `bewoner` (`huisid`, `naam`, aanhef, `kalehuur`, `verdeelsleutel`) VALUES 
('1', 'Piet', 'Geachte heer Piet', '123', '50'),
('1', 'Klaas', 'Geachte heer Klaas', '123', '50');

insert into categorie (catid, omschrijving) values
('1', 'energie'),
('2', 'water'),
('3', 'gemeente');

insert into service (huisid, omschrijving, catid, bedrag, maandbedrag, jaar) values
('1', 'gas en licht', '1', '33126', '1', '2004'),

Het mag duidelijk zijn dat dit een vrij simpele boekhoudapplicatie moet worden voor een aantal panden.

Als ik nu de volgende query gebruik:
code:
1
2
3
select huizen.straat, bewoner.naam, service.bedrag from huizen, service, bewoner
where  
huizen.id=service.huisid and huizen.id=bewoner.huisid and service.jaar='2004' and huizen.id=1


Zou ik verwachten dat ik 2 bewoners te pakken zou krijgen, met dus 2 stuks servicekosten dus:
code:
1
2
A-Straat | Piet | 33126
A-Straat | Klaas | 33126

Wat mij alleen elke keer weer verbaast is dat er niet 2, maar 3 items uitgevoerd worden; dus 1x een dubbele Piet/Klaas. In dit geval makkelijk op te lossen door er een select distinct query van te maken, maar problematischer bij een group-by statement (om dus uiteindelijk alle servicekosten bijelkaar op te tellen.)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Volgens mij moet je met bovenstaande gegevens de output van 2 regels krijgen. Ik zie geen fout in de query.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • n3ck
  • Registratie: Mei 2002
  • Laatst online: 24-07-2025
Ik zal eens een andere database proberen.. volgens mij moet die query ook gewoon goed zijn..

Verwijderd

maak er eens een gewone (INNER JOIN) van en geef eens wat echte info, gezien we hier niet uit af kunnen leiden of het echt klopt (je kan namelijk ook een fout gemaakt hebben)

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Doe eens een
SELECT huizen.straat, bewoner.naam, service.bedrag FROM huizen, service, bewoner
en geef het resultaat, misschien zie je dan de reden hiervoor.

Probeer anders eens een expliciete join, dus;
FROM huizen JOIN service ON huizen.id=service.huisid JOIN bewoner ON huizen.id=bewoner.huisid
WHERE service.jaar='2004'

Overigens is het conceptueel beter om de join te beginnen vanuit bewoner-tabel aangezien je daar de gegevens aan wilt koppelen.

[ Voor 19% gewijzigd door Remus op 17-11-2005 12:05 ]


Verwijderd

Remus schreef op donderdag 17 november 2005 @ 12:04:
Doe eens een
SELECT huizen.straat, bewoner.naam, service.bedrag FROM huizen, service, bewoner
en geef het resultaat, misschien zie je dan de reden hiervoor.

Probeer anders eens een expliciete join, dus;
FROM huizen JOIN service ON huizen.id=service.huisid JOIN bewoner ON huizen.id=bewoner.huisid
WHERE service.jaar='2004'

Overigens is het conceptueel beter om de join te beginnen vanuit bewoner-tabel aangezien je daar de gegevens aan wilt koppelen.
Gezien we zijn echte query niet kunnen zien moeten we maar geloven dat de query die hier staat 1 op 1 is. We weten dus nog steeds niet of er een fout in de echte query zit

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Aangezien ik toch ziek ben, heb ik dit maar even ter test in Interbase gepropt (en maar aangenomen dat er CONSTRAINT als PRIMARY KEY en FOREIGN KEY zijn gedefinieerd en bij mij komt er gewoon een goed resultaat uit.
Overigens viel mij op dat de laatste INSERT een komma heeft alsof er nog een waarde is ingevuld die hier niet getoond wordt.

Handig voor ons om te weten is:
1) Tabel definitie
2) De werkelijke inhoud van de huidige tabellen
3) Gebruikte DBMS.
Pagina: 1