2013-03-18 15 views
39

Próbowałem zapytania SQL podane poniżej:Jak używać kolejności przez zjednoczenie wszystkich w sql?

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

Wynika to w następujący błąd:

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.

muszę używać zamówienie w jedności wszystkich. Jak to zrobić?

Odpowiedz

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

ale jeśli chcesz mieć wszystkie rekordy z Table_A na górze listy rezultacie, można dodać użytkownik określić wartość, którą można wykorzystać do uporządkowania,

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

Dziękuję bardzo, że rozwiązał mój problem – Wella

+0

Nie ma za co ": D" cieszę się, że pomogło. –

+0

+1 Bardzo mi to pomogło. Dzięki – shashwat

22

nie robić naprawdę trzeba mieć nawias. Można sortować bezpośrednio:

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

Znacznie czystszy niż wybierz * -ing podzapytanie. – Nick

+0

Bardzo przydatne i jak powiedział Nick, znacznie czystsze. Dzięki – dajoto

+0

Czy jest to gdzieś udokumentowane? Znalazłem [przykład C w dokumencie UNION] (https://msdn.microsoft.com/en-us/library/ms180026.aspx), ale pokazuje, że można to zrobić i nie wyjaśnia tego. – 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

Nie jest to bezpośrednia reakcja PO, ale myślałem, że Jimmy tu odpowiadać na błąd messsage PO, który może skierować Cię w zupełnie innym kierunku!

Wszystkie te odpowiedzi odnoszą się do ogólnie ZAMÓWIENIE PRZEJRZYSTAJ po odebraniu zestawu rekordów i sortowaniu partii.

Co zrobić, jeśli chcesz ORDER BY niezależnie od porcji od UNITED niezależnie i nadal mają one "połączone" w tym samym 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 

Uwaga TOP 1000 jest liczbą arbitralną. Użyj wystarczająco dużej liczby, aby przechwycić wszystkie wymagane dane.

Powiązane problemy