[sql] order by bij union

Pagina: 1
Acties:

  • Mike Jarod
  • Registratie: Januari 2002
  • Niet online
Op m'n werk heb ik de laatste tijd veel te maken met verschillende tabellen die min of meer dezelfde informatie bevatten, maar met andere namen. Ik query deze tabellen middels een union statement.

Voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(
select nr as id,
naam as name,
omschrijving as description
from tabel1
)
union
(
select nummer as id,
achernaam as name,
functie as description
from tabel2
)
order by ???
Op zicht werkt dit allemaal prima, alleen het order by deel kom ik niet uit. Ik kan in dit voorbeeld bijvoorbeeld niet 'order by id' gebruiken, dan geeft ie namelijk een foutmelding. Ik kan bv wel 'order by tabel1.nr' gebruiken, maar dan ordert ie dus die 2e tabel niet mee.

Heeft iemand enig idee hoe ik dit oplos? Het gaat hier overigens om een Oracle omgeving. Ook heb ik geen rechten om een view aan te maken (geen ervaring mee maar ik heb het idee dat ik die hele union als view kan definieren zodat querien makkelijker gaat).

[ Voor 3% gewijzigd door Mike Jarod op 21-03-2005 19:43 ]


  • Mike78
  • Registratie: September 2000
  • Laatst online: 08-05 21:43

Mike78

Always

Werkt order by 1 niet, zodat hij de eerste kolom pakt?

24 uur per dag, 24 biertjes in een krat. Toeval?


  • Mike Jarod
  • Registratie: Januari 2002
  • Niet online
Mike78 schreef op maandag 21 maart 2005 @ 19:43:
Werkt order by 1 niet, zodat hij de eerste kolom pakt?
Hee da's best een goeie. Ik wist niet dat je op die manier kon orderen. Dat ga ik zeker even proberen :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Mike78 schreef op maandag 21 maart 2005 @ 19:43:
Werkt order by 1 niet, zodat hij de eerste kolom pakt?
Moet je voor de eerste kolom niet order by 0 hebben? Ik weet niet meer zeker of in SQL kolommen nou geindexeerd worden beginnend bij 0 of bij 1. :P En zou er geen implementatieverschil zijn?

[ Voor 10% gewijzigd door NMe op 21-03-2005 19:53 ]

'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.


  • Freee!!
  • Registratie: December 2002
  • Laatst online: 10-05 10:54

Freee!!

Trotse papa van Toon en Len!

-NMe- schreef op maandag 21 maart 2005 @ 19:52:
[...]
Moet je voor de eerste kolom niet order by 0 hebben? Ik weet niet meer zeker of in SQL kolommen nou geindexeerd worden beginnend bij 0 of bij 1. :P En zou er geen implementatieverschil zijn?
Standaard begint SQL bij 1 en ik ben nog geen implementatieverschillen tegengekomen op dit punt.

The problem with common sense is that sense never ain't common - From the notebooks of Lazarus Long

GoT voor Behoud der Nederlandschen Taal [GvBdNT


  • mylar
  • Registratie: Mei 2002
  • Laatst online: 06-05 12:05
code:
1
2
3
4
5
6
7
8
9
10
select nr as id,
naam as name,
omschrijving as description
from tabel1
union
select nummer as id,
achernaam as name,
functie as description
from tabel2
order by name


op deze manier zal hij orderen over het volledige resultaat.
Als je ook eventuele dubbels wilt weergeven in het resultaat moet je 'union all' gebruiken.
De haakjes waren dus niet echt nodig...

[ Voor 3% gewijzigd door mylar op 21-03-2005 19:59 ]


  • Mike Jarod
  • Registratie: Januari 2002
  • Niet online
-NMe- schreef op maandag 21 maart 2005 @ 19:52:
En zou er geen implementatieverschil zijn?
Doel je nou op het nut van het samenvoegen van de tabellen :? :)
Dat zit wel goed, enige probleem is af en toe dat het veld in tabel1 bv varchar is en bij tabel2 een integer, maar daar gebruik ik wel conversiefuncties voor.

edit: blijkbaar niet ...

edit2: @mylar, haakjes vind ik altijd wel fijn, icm tabs maakt dat je queries imo overzichtelijker.

edit3 alweer: ah je bedoelt dat ik zonder haakjes wel de 'as name' - naam kan gebruiken bij de order by?

[ Voor 28% gewijzigd door Mike Jarod op 21-03-2005 20:01 ]


  • mylar
  • Registratie: Mei 2002
  • Laatst online: 06-05 12:05
Mike Jarod schreef op maandag 21 maart 2005 @ 19:58:
[...]
edit3 alweer: ah je bedoelt dat ik zonder haakjes wel de 'as name' - naam kan gebruiken bij de order by?
jup :)

Als je nog altijd een fout krijgt, welke is dat dan?

  • Mike Jarod
  • Registratie: Januari 2002
  • Niet online
mylar schreef op maandag 21 maart 2005 @ 20:03:
Als je nog altijd een fout krijgt, welke is dat dan?
Zoals ik al zei doe ik dit op m'n werk, en nu werk ik niet :P Zal morgen even kijken of het werkt.

Verwijderd

Volgens mij zijn er 2 oplossingen, nl
code:
1
2
3
4
5
SELECT nr AS ID, naam AS NAME, omschrijving AS description
  FROM tabel1
UNION
SELECT nummer AS ID, achernaam AS NAME, functie AS description
  FROM tabel2

Oracle zal deze union sorteren op ID,NAME,DESCRIPTION omdat bij een UNION de dubbels eruit gefilterd worden. Zet dus de kolom(men) waarop je wil sorteren in de juiste volgorde.
Een andere mogelijkheid is de volgende :
code:
1
2
3
4
5
6
7
SELECT   ID, NAME, description
    FROM (SELECT nr AS ID, naam AS NAME, omschrijving AS description
            FROM tabel1
          UNION
          SELECT nummer AS ID, achernaam AS NAME, functie AS description
            FROM tabel2)
ORDER BY description

De oplossing die mylar voorstelt, klopt niet, die order by heeft dit dat geval enkel betrekking op de 2e select.

Over The UNION [ALL], INTERSECT, MINUS Operators, de ganse Oracle documentatie kan je vinden op http://tahiti.oracle.com

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 18-04 07:52

edeboeck

mie noow noooothing ...

Verwijderd schreef op dinsdag 22 maart 2005 @ 08:31:
Volgens mij zijn er 2 oplossingen, nl
code:
1
2
3
4
5
SELECT nr AS ID, naam AS NAME, omschrijving AS description
  FROM tabel1
UNION
SELECT nummer AS ID, achernaam AS NAME, functie AS description
  FROM tabel2
Hier maak je imho toch nog een klein foutje: je definieert twee maal een alias op eenzelfde kolom (wat, dacht ik toch, eigenlijk niet mag). De oplossing zou dus worden:
code:
1
2
3
4
5
6
SELECT nr AS ID, naam AS NAME, omschrijving AS description
  FROM tabel1
UNION
SELECT nummer, achternaam, functie
  FROM tabel2
ORDER BY 1


Automatisch krijgen de velden uit de tweede select de aliassen die in de eerste select gegeven zijn (dus "nummer" krijgt "ID" als alias enz.) en sortering wordt toegepast op alle records.

  • mylar
  • Registratie: Mei 2002
  • Laatst online: 06-05 12:05
Ok ik ging uit van mssql syntax, niet correct dus.
Mijn code zou ook niet gewerkt hebben, het moest iets zijn in deze aard (ter correctie):

code:
1
2
3
4
5
6
7
8
9
10
select nr as id,
naam as name,
omschrijving as description
from tabel1
union
select nummer,
achernaam,
functie
from tabel2
order by naam


De order by refereerd naar de 'echte' naam van de kolom in de eerste query waarop je wilt sorteren. En de order by is van toepassing op het volledige resultaat van de order by.

[ Voor 5% gewijzigd door mylar op 22-03-2005 10:14 ]

Pagina: 1