Toon posts:

[Interbase/SQL] Select union vraag

Pagina: 1
Acties:

Verwijderd

Topicstarter
Bij mijn applicatie is het mogelijk om aan te geven hoe producten in welke volgorde in een stelling staan.

Artikel met volgorde 1 staat links, volgorde 2 staat daarnaast, enz.....

Nu kan het ook zijn dat een nieuw product is aangemaakt, maar de gebruiker heeft nog niet de volgorde bepaald. Dus bij een nieuwe product, geef ik standaard de volgorde -1.


Nu wil ik via een query alle producten opvragen en dan op volgorde van hoe de gebruiker dat heeft ingevoerd. Dus 1,2,3,4, enz..... en alle producten met volgorde -1 komen als laatste.

Nu heb ik deze query:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT   A.ARTIKELID, AGA.POSITIE, A.INSDATE, A.INSTIME,
         A.ARTIKELNAAM, A.MULTIPACK, AM.MULTIPACKNAAM, AM.MULTIPACKINHOUD,
         A.ARTIKELINHOUD, A.COLLIEINHOUD, AV.VERPAKKINGAFKORTING, AE.EENHEIDAFKORTING
FROM     ARTIKELGROEPARTIKELEN AGA, ARTIKELEN A
         LEFT OUTER JOIN ARTIKELMULTIPACK AM ON A.MULTIPACKID=AM.MULTIPACKID
         LEFT OUTER JOIN ARTIKELVERPAKKING AV ON A.ARTIKELVERPAKKINGID=AV.VERPAKKINGID
         LEFT OUTER JOIN ARTIKELEENHEID AE ON A.ARTIKELEENHEIDID=AE.EENHEIDID
WHERE    AGA.ARTIKELID = A.ARTIKELID
  AND    AGA.ARTIKELGROEPID = 1
  AND    AGA.POSITIE <> -1
ORDER BY AGA.POSITIE
UNION
SELECT   A.ARTIKELID, AGA.POSITIE, A.INSDATE, A.INSTIME,
         A.ARTIKELNAAM, A.MULTIPACK, AM.MULTIPACKNAAM, AM.MULTIPACKINHOUD,
         A.ARTIKELINHOUD, A.COLLIEINHOUD, AV.VERPAKKINGAFKORTING, AE.EENHEIDAFKORTING
FROM     ARTIKELGROEPARTIKELEN AGA, ARTIKELEN A
         LEFT OUTER JOIN ARTIKELMULTIPACK AM ON A.MULTIPACKID=AM.MULTIPACKID
         LEFT OUTER JOIN ARTIKELVERPAKKING AV ON A.ARTIKELVERPAKKINGID=AV.VERPAKKINGID
         LEFT OUTER JOIN ARTIKELEENHEID AE ON A.ARTIKELEENHEIDID=AE.EENHEIDID
WHERE    AGA.ARTIKELID = A.ARTIKELID
  AND    AGA.ARTIKELGROEPID = 1
  AND    AGA.POSITIE = -1
ORDER BY A.INSDATE, A.INSTIME;

Echter dit werkt niet vanwege die order by. Ik heb gekeken in de SQL reference en volgens mij is het onmogelijk om voor de union een order by te plaatsen. Het kan geloof ik alleen helemaal onderaan en je kan dan alleen maar veld nummers weergeven i.p.v. velden.

Weet iemand hoe ik dit op een andere manier wel werkend zou kunnen krijgen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Probeer eens ipv de veldnamen mee te geven aan je ORDER BY, de veld'nummers' mee te geven waarop moet gesorteerd worden van je select list:

code:
1
2
...
ORDER BY 3, 4

in jouw geval.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ja dat werkt wel. Je moet het veld nummer weergeven ipv de veldnaam.

Maar je mag zoiezo geen order by boven de union hebben.

En het probleem is dat de bovenste select gesorteerd moet worden op AGA.POSITIE en de onderste select op A.INSDATE, A.INSTIME

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
In het 2e select statement, zou je ipv aga.positie en onmogelijk hoog getal op kunnen vragen of iets als (select max(aga.positie) + 1 from ...) en dan ORDER BY 2,3,4 gebruiken

Verwijderd

Topicstarter
_js_ schreef op 15 maart 2004 @ 11:57:
In het 2e select statement, zou je ipv aga.positie en onmogelijk hoog getal op kunnen vragen of iets als (select max(aga.positie) + 1 from ...) en dan ORDER BY 2,3,4 gebruiken
Ik snap niet precies wat je bedoeld.

Volgens mij is het grootste probleem dat die order by alleen werkt op de union verzameling en kan je dus niet aparte sorteer methode aangeven voor de 2 select query's.

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 23:18

Delphi32

Heading for the gates of Eden

In je tweede deel van de union staat
code:
1
2
3
SELECT ..... , AGA.POSITION, ....
.. 
WHERE AGA.POSITION = -1

Als je de SELECT van het veld Position nou vervangt door een enorm groot getal:
code:
1
SELECT ....., 9999999 AS POSITION, .....

dan kan je je hele resultset orderen by het veld Position.

Verwijderd

Topicstarter
Dit werkt inderdaad:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT   A.ARTIKELID, AGA.POSITIE, A.INSDATE, A.INSTIME,
         A.ARTIKELNAAM, A.MULTIPACK, AM.MULTIPACKNAAM, AM.MULTIPACKINHOUD,
         A.ARTIKELINHOUD, A.COLLIEINHOUD, AV.VERPAKKINGAFKORTING, AE.EENHEIDAFKORTING
FROM     ARTIKELGROEPARTIKELEN AGA, ARTIKELEN A
         LEFT OUTER JOIN ARTIKELMULTIPACK AM ON A.MULTIPACKID=AM.MULTIPACKID
         LEFT OUTER JOIN ARTIKELVERPAKKING AV ON A.ARTIKELVERPAKKINGID=AV.VERPAKKINGID
         LEFT OUTER JOIN ARTIKELEENHEID AE ON A.ARTIKELEENHEIDID=AE.EENHEIDID
WHERE    AGA.ARTIKELID = A.ARTIKELID
  AND    AGA.ARTIKELGROEPID = 2
  AND    AGA.POSITIE <> -1
/*ORDER BY 3, 4 /*AGA.POSITIE*/
UNION
SELECT   A.ARTIKELID, 999999 AS POSITIE, A.INSDATE, A.INSTIME,
         A.ARTIKELNAAM, A.MULTIPACK, AM.MULTIPACKNAAM, AM.MULTIPACKINHOUD,
         A.ARTIKELINHOUD, A.COLLIEINHOUD, AV.VERPAKKINGAFKORTING, AE.EENHEIDAFKORTING
FROM     ARTIKELGROEPARTIKELEN AGA, ARTIKELEN A
         LEFT OUTER JOIN ARTIKELMULTIPACK AM ON A.MULTIPACKID=AM.MULTIPACKID
         LEFT OUTER JOIN ARTIKELVERPAKKING AV ON A.ARTIKELVERPAKKINGID=AV.VERPAKKINGID
         LEFT OUTER JOIN ARTIKELEENHEID AE ON A.ARTIKELEENHEIDID=AE.EENHEIDID
WHERE    AGA.ARTIKELID = A.ARTIKELID
  AND    AGA.ARTIKELGROEPID = 2
  AND    AGA.POSITIE = -1
ORDER BY 2, 3, 4; /*A.INSDATE, A.INSTIME;*/

Het is alleen wel een beetje een "knoei-oplossing". Maar goed het is voor mij goed te gebruiken.
Pagina: 1