Hoe gebruik je order by met union all in sql?

Ik heb de onderstaande sql-query geprobeerd:

SELECT * FROM (SELECT * 
FROM TABLE_A ORDER BY COLUMN_1)DUMMY_TABLE
UNION ALL 
SELECT * FROM TABLE_B 

Het resulteert in de volgende fout:

De ORDER BY-clausule is ongeldig in views, inline-functies, afgeleid
tabellen, subquery’s en algemene tabeluitdrukkingen, tenzij TOP of FOR
XML is ook gespecificeerd.

Ik moet order by gebruiken in union all. Hoe bereik ik dit?


Antwoord 1, autoriteit 100%

SELECT  * 
FROM 
        (
            SELECT * FROM TABLE_A 
            UNION ALL 
            SELECT * FROM TABLE_B
        ) dum
-- ORDER BY .....

maar als u alle records van Table_Abovenaan de resultatenlijst wilt hebben, kunt u een door de gebruiker gedefinieerde waarde toevoegen die u kunt gebruiken om te bestellen,

SELECT  * 
FROM 
        (
            SELECT *, 1 sortby FROM TABLE_A 
            UNION ALL 
            SELECT *, 2 sortby FROM TABLE_B
        ) dum
ORDER   BY sortby 

Antwoord 2, autoriteit 39%

U hoeft niet echt haakjes te hebben. U kunt direct sorteren:

SELECT *, 1 AS RN FROM TABLE_A
UNION ALL 
SELECT *, 2 AS RN FROM TABLE_B
ORDER BY RN, COLUMN_1

Antwoord 3, autoriteit 25%

Geen directe reactie van OP, maar ik dacht dat ik hier even zou reageren op het ERROR-bericht van de OP, wat je misschien helemaal in een andere richting wijst!

Al deze antwoorden verwijzen naar een algemeneORDER BY zodra de recordset is opgehaald en u de partij sorteert.

Wat als u onafhankelijk wilt BESTELLEN DOOR elk deelvan de UNIE, en ze nog steeds “aangesloten” wilt hebben in dezelfde SELECT?

SELECT pass1.* FROM 
 (SELECT TOP 1000 tblA.ID, tblA.CustomerName 
  FROM TABLE_A AS tblA ORDER BY 2) AS pass1
UNION ALL 
SELECT pass2.* FROM 
  (SELECT TOP 1000 tblB.ID, tblB.CustomerName 
   FROM TABLE_B AS tblB ORDER BY 2) AS pass2

Let op: de TOP 1000 is een willekeurig getal. Gebruik een getal dat groot genoeg is om alle benodigde gegevens vast te leggen.


Antwoord 4

Er zullen momenten zijn waarop u iets als dit moet doen:

Trek top 5 uit tabel 1 op basis van een sortering
en onderste 5 uit tabel 2 op basis van een andere sortering
en verenig deze samen.

oplossing

select * from (
-- top 5 records
select top 5 col1, col2, col3 
from table1 
group by col1, col2
order by col3 desc ) z 
union all
select * from (
-- bottom 5 records 
select top 5 col1, col2, col3 
from table2 
group by col1, col2
order by col3 ) z 

dit was de enige manier waarop ik de fout kon omzeilen en werkte prima voor mij.


Antwoord 5

SELECTEER * UIT (SELECTEER *
VANAF TABLE_A BESTEL DOOR COLUMN_1)DUMMY_TABLE
UNION ALLES
SELECT * FROM TABLE_B
BESTEL DOOR 2;

2 is hier kolomnummer.. In Oracle SQL kunt u het kolomnummer gebruiken waarop u de gegevens wilt sorteren


Antwoord 6

select CONCAT(Name, '(',substr(occupation, 1, 1), ')') AS f1
from OCCUPATIONS
union
select temp.str AS f1 from 
(select count(occupation) AS counts, occupation, concat('There are a total of ' ,count(occupation) ,' ', lower(occupation),'s.') As str  from OCCUPATIONS group by occupation order by counts ASC, occupation ASC
 ) As temp
 order by f1

Other episodes