2013-03-18 16 views
39

Ho provato la query SQL indicato di seguito:Come utilizzare l'ordine con union all in sql?

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

Essa si traduce nella seguente errore:

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.

ho bisogno di usare ORDER BY in unione tutti. Come posso realizzare questo?

risposta

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

, ma se si vuole avere tutti i record Table_A in cima alla lista dei risultati, l'utente è possibile aggiungere il valore che può essere utilizzato per l'ordinazione definire,

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

Grazie mille è stato risolto il mio problema – Wella

+0

prego ": D è contento che sia stato d'aiuto. –

+0

+1 Mi ha aiutato molto. Grazie – shashwat

22

Non lo sai davvero bisogno di avere una parentesi. È possibile ordinare direttamente:

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

Molto più pulito di selezionare * -ing una sottoquery. – Nick

+0

Molto utile e, come diceva Nick, molto più pulito. Grazie – dajoto

+0

Questo documento è documentato da qualche parte? Ho trovato [Esempio C nel documento UNION] (https://msdn.microsoft.com/en-us/library/ms180026.aspx), ma mostra che può essere fatto e non lo spiega. – 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

Non una risposta diretta OP, ma ho pensato che sarebbe jimmy qui rispondere alla messsage ERRORE del PO, che possono puntare in un'altra direzione del tutto!

Tutte queste risposte si riferiscono a uno complessivo ORDER BY una volta che il set di record è stato recuperato e si ordina il lotto.

Cosa succede se si desidera ORDINARE DA ciascuna parte dell'UNIONE in modo indipendente e averli ancora "uniti" nella stessa 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 

Nota: TOP 1000 è un numero arbitrario. Utilizzare un numero sufficiente per acquisire tutti i dati necessari.