[SQL] SELECT uit 2 tabellen; krijg niet gewenste resultaat

Pagina: 1
Acties:
  • 123 views sinds 30-01-2008

  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
Ik ben op zoek naar een SQL-SELECT Statement waarbij alle kamernummers weergegeven moeten worden die NIET gereserveerd zijn op 26-05-2003.

Ik kwam op de volgende:
code:
1
2
3
SELECT K.Kamernummer
FROM Kamers AS K, Reserveringen AS R
WHERE K.Kamernummer = R.Kamernummer AND R.Begindatum <> '26-05-2003';

Nu geeft hij dus als uitkomst kamernummer 4, 5 en nog een keer 4. Terwijl nummer 1, 6, 7, 8, 9 en 10 ook kamers zijn die niet gereserveerd zijn op 26-05-2003. Deze komen alleen niet voor in de tabel reserveringen omdat ze nog nooit gereserveerd zijn. Daarnaast geeft hij nu kamer 4 dubbel weer, terwijl deze maar één keer bestaat. Hij doet dus blijkbaar weinig met de tabel 'Kamers'.

Databasestructuur:

Tabel Reserveringen
Begindatum ---------------- Kamernummer
26-05-2003 ---------------- 2
26-05-2003 ---------------- 3
27-05-2003 ---------------- 4
28-05-2003 ---------------- 5
03-06-2003 ---------------- 4

Tabel Kamers
Kamernummer
1
2
3
4
5
6
7
8
9
10

Waar ga ik de fout in? Wat is het juiste SQL-statement?

(Ik had dit al via een reply in een ander topic gevraagd, ik denk dat het hier meer op zijn plaats is. Waarschijnlijk krijg ik hier ook meer reacties.)

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Welk DBMS gebruik je.

Je zult een OUTER (of ook wel een LEFT) join moeten gebruiken.
De join die jij gebruikt (INNER Join), gaat nl. enkel de kamers weer geven die ook een record hebben in de tabel reserveringen.
Een outer join gaat alle kamers gaan ophalen met de bijhorende reserving, ook al heeft die kamer geen reservering.
(Als je MySQL gebruikt, zul je het anders moeten oplossen, aangezien die geen outer join ondersteund).

https://fgheysels.github.io/


Verwijderd

SELECT Kamernummer
FROM Kamers
WHERE Kamernummer NOT IN
(SELECT Kamernummer FROM Reserveringen
where Begindatum = '26-05-2003')

Zoiets? Weet niet of je DB subselects aankan, maar je zou het kunnen proberen

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 10:11

pistole

Frutter

code:
1
2
3
SELECT K.Kamernummer
FROM Kamers AS K, Reserveringen AS R
WHERE K.Kamernummer *= R.Kamernummer AND R.Begindatum <> '26-05-2003';

zoiets?
whoami schreef op 26 May 2003 @ 21:07:
(Als je MySQL gebruikt, zul je het anders moeten oplossen, aangezien die geen outer join ondersteund).
:Z bah

[ Voor 44% gewijzigd door pistole op 26-05-2003 21:14 ]

Ik frut, dus ik epibreer


Verwijderd

het hangt er een beetje vanaf in welke dbase je dit hebt zitten
volgens mij zit het in het feit dat als je een datum zo noteert deze gezien wordt als 26/05/2003 00:00:00.

je moet iets doen als :
begindatum <'26/5/2003' or begindatum >='27/5/2003'

afhankelijk van je dbase zul je hier een formatering overheen moeten halen

  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
Het is een MS Acces 2002 database.

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Probeer het eens dmv een outer join:

code:
1
2
3
4
5
select k.kamernummer
from kamers
left join reserveringen
on kamers.kamernr = reserveringen.kamernr
where reserveringen.datum <> #26/5/2003#

https://fgheysels.github.io/


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 10:11

pistole

Frutter

EmilneM schreef op 26 May 2003 @ 21:14:
Het is een MS Acces 2002 database.
Dan kan je prima outer joins gebruiken. Tip: query builder.

Overigens, even offtopic voor alle MySQLlertjes:
6.4.1.1 JOIN Syntax

MySQL supports the following JOIN syntaxes for use in SELECT statements:

table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference INNER JOIN table_reference join_condition
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference join_condition
table_reference LEFT [OUTER] JOIN table_reference
table_reference NATURAL [LEFT [OUTER]] JOIN table_reference
{ OJ table_reference LEFT OUTER JOIN table_reference ON conditional_expr }
table_reference RIGHT [OUTER] JOIN table_reference join_condition
table_reference RIGHT [OUTER] JOIN table_reference
table_reference NATURAL [RIGHT [OUTER]] JOIN table_reference

Ik frut, dus ik epibreer


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
pistole schreef op 26 May 2003 @ 21:19:
[...]

Dan kan je prima outer joins gebruiken. Tip: query builder.

Overigens, even offtopic voor alle MySQLlertjes:

[...]
Over die join-syntax.

Zowel de syntax met het join - keyword als de syntax dmv te joinen in de where zijn perfect mogelijk en goed.
Welke je gebruikt, is gewoon een kwestie van smaak.
Qua performance maakt het niet uit welke je gebruikt.

https://fgheysels.github.io/


Verwijderd

Aangezien in de tabel reserveringen ook de kamernummers staan, heb je geen join nodig. Maar om je probleem echt op te lossen doe je een 'group by'.


Select * from Reserveringen where Begindatum <> '26-05-2003' group by KamerNummer

Suc6

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Verwijderd schreef op 26 May 2003 @ 21:22:
Aangezien in de tabel reserveringen ook de kamernummers staan, heb je geen join nodig. Maar om je probleem echt op te lossen doe je een 'group by'.


Select * from Reserveringen where Begindatum <> '26-05-2003' group by KamerNummer

Suc6
Je kunt het idd ook zo oplossen. Echter, als je gegevens wilt uit de tabel 'Kamer', zal je het dmv een (outer) join moeten oplossen.

Er zit echter wel een foutje in je query.
Je mag enkel een group by clause gebruiken als je gebruik maakt van aggregated functions. En als je groepeert, dan moet je alle velden uit je select list die geen aggregated functie zijn, opnemen in je group by clausule. Jij neemt alleen kamernummer op in je group by list, en je maakt geen gebruik van aggregated functions.
Je zou dit echter wel kunnen oplossen dmv een distinct. Echter, een distinct geeft enkel de unieke rijen terug, dus zal je geen SELECT * mogen doen, maar eerder:
code:
1
2
3
SELECT DISTINCT kamernummer
FROM reserveringen
WHERE datum <> ....

https://fgheysels.github.io/


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
Verwijderd schreef op 26 May 2003 @ 21:08:
SELECT Kamernummer
FROM Kamers
WHERE Kamernummer NOT IN
(SELECT Kamernummer FROM Reserveringen
where Begindatum = '26-05-2003')

Zoiets? Weet niet of je DB subselects aankan, maar je zou het kunnen proberen
Ik heb deze gebruikt en hij werkt goed. Bedankt!

Nu wil ik naast Begindatum ook met Einddatum gaan werken.

Begindatum ---------- Einddatum ---------- Kamernummer
26-05-2003 ---------- 29-05-2003 --------- 1
28-05-2003 ---------- 29-05-2003 --------- 2
01-06-2003 ---------- 04-06-2003 --------- 1
20-05-2003 ---------- 05-07-2003 --------- 6

Nu wil ik dat alle kamers worden weergegeven die vrij zijn tussen 27-05-2003 en 29-05-2003. Hij moet nu dus met datums gaan werken en ik heb geen idee hoe dat voor elkaar te krijgen. De applicatie bouw ik met Visual Basic 6, waar ik dus ook de SQL-queries mee uitvoer.

Als het goed is moet de uitkomst dan zijn:

Kamernummer
3
4
5
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Wat is hier voor de SQL-query?

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Sorry hoor, maar dit is echt basic SQL werk.
Lees alle posts in dit topic nog eens goed door, en neem ook dit eens door.

Met een beetje logisch nadenkwerk kom je er wel.
P&W is echter geen forum waar men je bij het handje neemt, en alle code voor jou gaat voorkauwen.

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.