Toon posts:

[SQL] Probleem met UNION query

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de volgende query:

code:
1
2
3
4
5
6
7
8
9
10
SELECT VK.KLASSE, VK.VLIEGTUIGKLASSEID, VK.ZITPLAATS, P.PRIJS
FROM   VM_VLIEGTUIGKLASSE VK, VM_PRIJZEN P
WHERE  VK.VLIEGTUIGID = 1
  AND  P.VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID
  AND  P.VLUCHTID = 1
UNION
SELECT COUNT(*) AS GERESERVEERD
FROM   VM_RESERVERINGEN
WHERE  VLUCHTID = 1
  AND  VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID;


Ik wil dus de klassen opvragen van een vliegtuig op een bepaalde vlucht (1e query) en vervolgens het aantal gereserveerde stoelen opvragen van die klasse (2e query).

Ik wil dit in 1 query doen. Maar het probleem is dat ik in die 2e query moet refereren naar de vliegtuigklasseid in de 1e query en dat mag uiteraard niet.

Is dit wel op te lossen met 1 query en zo ja hoe?

Verwijderd

Kan je dat niet beter met een INNER JOIN doen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Kun je dat niet met een simpele join doen?

Bij een union moet je evenveel columns in de Select statements zetten en de typen van die columns moeten ook overeenkomen. Een union is in dit geval zeker niet de aangewezen manier om tot het resultaat te komen.

https://fgheysels.github.io/


  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Deze union kan helemaal niet goed gaan omdat de resultaten vanuit beiden queries homogeen moeten zijn.

Verwijderd

Topicstarter
Dan zou ik dus zoiets moeten gebruiken:

code:
1
2
3
4
5
6
SELECT VK.KLASSE, VK.VLIEGTUIGKLASSEID, VK.ZITPLAATS, P.PRIJS, COUNT(R.*) AS GERESERVEERD
FROM   VM_VLIEGTUIGKLASSE VK, VM_PRIJZEN P
       INNER JOIN VM_RESERVERINGEN R ON VK.vliegtuigklasseid = R.vliegtuigklasseid
WHERE  VK.VLIEGTUIGID = 1
  AND  P.VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID
  AND  P.VLUCHTID = 1


Maar dan zit ik weer met het probleem dat ik niet de count op kan vragen. (COUNT (R.*) is niet toegestaan en COUNT(*) geeft niet de juiste informatie)

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 30-08 10:19

Dido

heforshe

Ik heb het vermoeden dat je een GROUP BY zult moeten gaan gebruiken. (Dan is COUNT(*) genoeg.

Waarom gebruik je trouwens niet simpelweg
code:
1
2
3
4
..
FROM   VM_VLIEGTUIGKLASSE VK, VM_PRIJZEN P, VM_RESERVERINGEN R 
WHERE  P.VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID
  AND  VK.VLIEGTUIGKLASSEID = R.VLIEGTUIGKLASSEID

?

Wat betekent mijn avatar?


  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 22:18

The Eagle

I wear my sunglasses at night

T'is niet dat ik niet wil helpen, maar dit klinkt als een huiswerkopdracht van een HBO-informatica-opleiding....en daar zijn we niet voor, toch?

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Verwijderd

Topicstarter
The_Eagle schreef op 24 oktober 2002 @ 12:30:
T'is niet dat ik niet wil helpen, maar dit klinkt als een huiswerkopdracht van een HBO-informatica-opleiding....en daar zijn we niet voor, toch?
Het is inderdaad een project voor school, waarin het de bedoeling is om een systeem te bouwen dat bestaat uit 2 applicaties waar data uitgewisseld wordt d.m.v. XML.

Hiervoor moeten we dus een aantal query's bouwen die de gevraagde gegevens in het XML bestand opzoeken in de database. We zitten nu dus met deze query waar we niet uit komen. Het is gewoon een simpele vraag die ik hier stel.


Maar wat maakt het uit of het voor school is?????? Ik zit gewoon met een probleem en dat vraag ik hier gewoon. :? :? :? :?

Als je niks nuttigs bij te dragen hebt aan mijn vraag, lijkt het mij logisch om dan niks te posten.

  • Ecto2002
  • Registratie: Juni 2002
  • Laatst online: 01-06 14:13
Ik denk dat je het probleem moet oplossen met een subquery. Het kan zijn dat deze werkt, maar je moet er misschien nog wat aan sleutelen :

SELECT VK.KLASSE, VK.VLIEGTUIGKLASSEID, VK.ZITPLAATS, P.PRIJS
FROM VM_VLIEGTUIGKLASSE VK, VM_PRIJZEN P, (SELECT VLIEGTUIGKLASSEID, COUNT(*) AS GERESERVEERD FROM VM_RESERVERINGEN WHERE VLUCHTID = 1 GROUP BY VLIEGTUIGKLASSEID) SUBQ
WHERE VK.VLIEGTUIGID = 1
AND P.VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID
AND P.VLUCHTID = 1
AND SUBQ.VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID

Verwijderd

Topicstarter
Ecto2002 schreef op 24 oktober 2002 @ 12:53:
Ik denk dat je het probleem moet oplossen met een subquery. Het kan zijn dat deze werkt, maar je moet er misschien nog wat aan sleutelen :

SELECT VK.KLASSE, VK.VLIEGTUIGKLASSEID, VK.ZITPLAATS, P.PRIJS
FROM VM_VLIEGTUIGKLASSE VK, VM_PRIJZEN P, (SELECT VLIEGTUIGKLASSEID, COUNT(*) AS GERESERVEERD FROM VM_RESERVERINGEN WHERE VLUCHTID = 1 GROUP BY VLIEGTUIGKLASSEID) SUBQ
WHERE VK.VLIEGTUIGID = 1
AND P.VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID
AND P.VLUCHTID = 1
AND SUBQ.VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID
Deze query geeft een fout: Token Unknown , (SELECT ...

Volgens mij is het niet mogelijk om het in 1 query te doen.

(Ik maak gebruik van Interbase)

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
MySQL ondersteunt geen subqueries, maar het zou me verwonderen dat dat met interbase niet kan?

https://fgheysels.github.io/


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Verwijderd schreef op 24 oktober 2002 @ 13:24:
[...]

Deze query geeft een fout: Token Unknown , (SELECT ...

Volgens mij is het niet mogelijk om het in 1 query te doen.

(Ik maak gebruik van Interbase)
De kans dat het niet kan is klein. :)
Probeer deze eens
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT  VK.KLASSE, VK.VLIEGTUIGKLASSEID, VK.ZITPLAATS, P.PRIJS
FROM    VM_VLIEGTUIGKLASSE VK,
    VM_PRIJZEN P,
    (SELECT VLIEGTUIGKLASSEID, COUNT(*) AS GERESERVEERD
    FROM VM_RESERVERINGEN
    WHERE VLUCHTID = 1
    GROUP BY VLIEGTUIGKLASSEID) AS SUBQ
WHERE   VK.VLIEGTUIGID = 1
AND P.VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID
AND P.VLUCHTID = 1
AND SUBQ.VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID

Kunnen er trouwens meerdere vliegtuigen aan één vliegtuigklasse gekoppeld zijn? Zo ja, dan moet je de group by nog een beetje aan passen. En daardoor natuurlijk ook nog een filter onderaan.

Never underestimate the power of


Verwijderd

Topicstarter
cameodski schreef op 24 oktober 2002 @ 14:36:
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT  VK.KLASSE, VK.VLIEGTUIGKLASSEID, VK.ZITPLAATS, P.PRIJS
FROM    VM_VLIEGTUIGKLASSE VK,
    VM_PRIJZEN P,
    (SELECT VLIEGTUIGKLASSEID, COUNT(*) AS GERESERVEERD
    FROM VM_RESERVERINGEN
    WHERE VLUCHTID = 1
    GROUP BY VLIEGTUIGKLASSEID) AS SUBQ
WHERE   VK.VLIEGTUIGID = 1
AND P.VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID
AND P.VLUCHTID = 1
AND SUBQ.VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID
Interbase gaat over zijn bek op de (SELECT.....) in de FROM module.
Kunnen er trouwens meerdere vliegtuigen aan één vliegtuigklasse gekoppeld zijn? Zo ja, dan moet je de group by nog een beetje aan passen. En daardoor natuurlijk ook nog een filter onderaan.
Nee per vliegtuig worden er aparte klassen aangemaakt.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Dan doe je hem toch niet in de FROM. Krijg je zoiets:
code:
1
2
3
4
5
6
7
8
9
SELECT  VK.KLASSE, VK.VLIEGTUIGKLASSEID, VK.ZITPLAATS, P.PRIJS,
    (SELECT COUNT(*)
    FROM VM_RESERVERINGEN
    WHERE VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID) AS GERESERVEERD
FROM    VM_VLIEGTUIGKLASSE VK,
    VM_PRIJZEN P
WHERE   VK.VLIEGTUIGID = 1
AND P.VLIEGTUIGKLASSEID = VK.VLIEGTUIGKLASSEID
AND P.VLUCHTID = 1

Never underestimate the power of


Verwijderd

Topicstarter
Bedankt cameodski,

het werkt!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Subqueries in de select-list zijn weliswaar niet erg goed voor de performance, maar als Interbase het anders weigert te begrijpen, doe je soms wat.
Maar het is gelukkig toch maar voor school. :9

Never underestimate the power of

Pagina: 1