2013-03-18 16 views
39

habe ich versucht, die SQL-Abfrage unten angegeben:Wie verwendet man Order by mit union all in sql?

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

Es ist in dem folgenden Fehler führt:

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.

Ich brauche alle in der Vereinigung durch, um zu verwenden. Wie erreiche ich das?

Antwort

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

aber wenn Sie alle Datensätze aus Table_A auf der Spitze der Ergebnisliste haben wollen, können die Sie hinzufügen Benutzerwert definieren, die Sie für die Bestellung verwenden können,

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

Vielen Dank es ist mein Problem gelöst – Wella

+0

Sie sind willkommen ': D' froh, dass es geholfen hat. –

+0

+1 Es hat mir sehr geholfen. Danke – shashwat

22

Sie dies nicht tun muss wirklich Klammern haben. Sie können direkt sortieren:

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

Viel sauberer als wählen Sie eine Unterabfrage *. – Nick

+0

Sehr nützlich und wie Nick sagte, viel sauberer. Danke – dajoto

+0

Ist das irgendwo dokumentiert? Ich habe [Beispiel C in der UNION doc] (https://msdn.microsoft.com/en-us/library/ms180026.aspx) gefunden, aber es zeigt, dass es gemacht werden kann, und es nicht erklärt. – Trisped

-5
Select 'Shambhu' as ShambhuNewsFeed,Note as [News Fedd],NotificationId 
from Notification with(nolock) where [email protected] 
Union All 
Select 'Shambhu' as ShambhuNewsFeed,Note as [Notification],NotificationId 
from Notification with(nolock) 
where [email protected] 
order by NotificationId desc 
5

Nicht ein OP direkte Antwort, aber ich dachte, ich würde jimmy hier Antworten auf die der Fehler messsage des OP, die Sie in eine andere Richtung vollständig zeigen kann!

Alle diese Antworten beziehen sich auf eine insgesamt ORDER BY, sobald der Datensatz abgerufen wurde und Sie sortieren das Los.

Was ist, wenn Sie von jeden Teil der UNION unabhängig bestellen möchten, und noch haben sie "beigetreten" in der gleichen 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 

Beachten Sie, dass die TOP 1000 eine willkürliche Zahl ist. Verwenden Sie eine ausreichend große Nummer, um alle benötigten Daten zu erfassen.