W jaki sposób można programowo posortować zapytanie składające podczas pobierania danych z dwóch tabel? Na przykład,
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
Zgłasza wyjątek
Uwaga: próbowano tego dokonać na silniku bazy danych MS Access Jet
SELECT TOP 100 PERCENT
ORDER BY
SELECT field1 FROM table1 UNION SELECT field1 FROM table2 ORDER BY field1
źródło
UNION
nie pozwala na to. Może istnieć inna konstrukcja, która to zrobi. Nie może. Tak czy inaczej, ta odpowiedź technicznie nie spełnia tego, o co prosił autor.ORDER BY
jest częścią kursora, podczas gdyUNION
operuje na tabelach, dlatego ich kod nie może działać. Nie rozumiem, jak można wywnioskować zamiar OP na podstawie absurdalnego kodu. Weź pod uwagę, że SQLUNION
usuwa duplikaty: czy jeśli są to twoje „uporządkowane zestawy wyników”,{1, 2, 3} UNION {2, 4, 6}
czy wynik byłby{1, 2, 3, 4, 6}
czy{1, 3, 2, 4, 6}
? Nie wiemy, ponieważ suma „uporządkowanych zestawów wyników” jest niezdefiniowana w przypadku SQL, a OP nie została określona.Myślę, że to dobrze wyjaśnia.
Poniżej znajduje się zapytanie UNION, które używa klauzuli ORDER BY:
select supplier_id, supplier_name from suppliers where supplier_id > 2000 UNION select company_id, company_name from companies where company_id > 1000 ORDER BY 2;
Ponieważ nazwy kolumn w obu instrukcjach „select” są różne, korzystniejsze jest odwoływanie się do kolumn w klauzuli ORDER BY na podstawie ich pozycji w zestawie wyników.
W tym przykładzie posortowaliśmy wyniki według
supplier_name
/company_name
w porządku rosnącym, zgodnie z oznaczeniem „ORDER BY 2”.W
supplier_name
/company_name
pola są na pozycji # 2 w zestawie wyników.Zaczerpnięte stąd: http://www.techonthenet.com/sql/union.php
źródło
Na konkretnym przykładzie:
SELECT name FROM Folders ORDER BY name UNION SELECT name FROM Files ORDER BY name
Akta:
Lornetka składana:
Żądany wynik: (wyniki pierwszego wyboru jako pierwsze, tj. Najpierw foldery)
SQL, aby osiągnąć pożądane wyniki:
SELECT name FROM ( SELECT 1 AS rank, name FROM Folders UNION SELECT 2 AS rank, name FROM Files) dt ORDER BY rank, name
źródło
dt
), inaczej nie zadziała. Byłem tym zaskoczony przez chwilę, ponieważ na początku pominąłem ten szczegół, a komunikat o błędzie wyrzucony przez SSMS nie jest szczególnie pomocny.Oto przykład z Northwind 2007:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity] FROM [Product Orders] UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] FROM [Product Purchases] ORDER BY [Order Date] DESC;
Klauzula ORDER BY musi być tylko ostatnią instrukcją, po wykonaniu wszystkich połączeń. Możesz połączyć kilka zestawów razem, a następnie umieścić klauzulę ORDER BY po ostatnim zestawie.
źródło
(SELECT table1.field1 FROM table1 UNION SELECT table2.field1 FROM table2) ORDER BY field1
Praca? Pamiętaj o zestawach myślowych. Pobierz zestaw, który chcesz, używając unii, a następnie wykonaj na nim operacje.
źródło
SELECT table1Column1 as col1,table1Column2 as col2 FROM table1 UNION ( SELECT table2Column1 as col1, table1Column2 as col2 FROM table2 ) ORDER BY col1 ASC
źródło
SELECT field1 FROM ( SELECT field1 FROM table1 UNION SELECT field1 FROM table2 ) AS TBL ORDER BY TBL.field1
(użyj ALIAS)
źródło
To najgłupsza rzecz, jaką kiedykolwiek widziałem, ale działa i nie można dyskutować z wynikami.
SELECT * FROM ( SELECT table1.field1 FROM table1 ORDER BY table1.field1 UNION SELECT table2.field1 FROM table2 ORDER BY table2.field1 ) derivedTable
Wnętrze tabeli pochodnej nie będzie działać samodzielnie, ale jako tabela pochodna działa doskonale. Wypróbowałem to na SS 2000, SS 2005, SS 2008 R2 i wszystkie trzy działają.
źródło
Tak to się robi
select * from (select top 100 percent pointx, pointy from point where pointtype = 1 order by pointy) A union all select * from (select top 100 percent pointx, pointy from point where pointtype = 2 order by pointy desc) B
źródło
Przeglądając tę sekcję komentarzy, natrafiłem na dwa różne wzorce odpowiadające na to pytanie. Niestety w przypadku SQL 2012 drugi wzorzec nie działa, więc oto moje „obejście”
Zamów na wspólnej kolumnie
To najłatwiejszy przypadek, jaki możesz napotkać. Jak zauważyło wielu użytkowników, wszystko, co naprawdę musisz zrobić, to dodać
Order By
na końcu zapytaniaSELECT a FROM table1 UNION SELECT a FROM table2 ORDER BY field1
lub
SELECT a FROM table1 ORDER BY field1 UNION SELECT a FROM table2 ORDER BY field1
Sortuj według w różnych kolumnach
Oto, gdzie to naprawdę staje się trudne. Używając SQL 2012, wypróbowałem najwyższy post i to nie działa.
SELECT * FROM ( SELECT table1.field1 FROM table1 ORDER BY table1.field1 ) DUMMY_ALIAS1 UNION ALL SELECT * FROM ( SELECT table2.field1 FROM table2 ORDER BY table2.field1 ) DUMMY_ALIAS2
Postępując zgodnie z zaleceniem w komentarzu, spróbowałem tego
SELECT * FROM ( SELECT TOP 100 PERCENT table1.field1 FROM table1 ORDER BY table1.field1 ) DUMMY_ALIAS1 UNION ALL SELECT * FROM ( SELECT TOP 100 PERCENT table2.field1 FROM table2 ORDER BY table2.field1 ) DUMMY_ALIAS2
Ten kod skompilował, ale
DUMMY_ALIAS1
iDUMMY_ALIAS2
przesłaniaOrder By
ustalone wSelect
instrukcji, co sprawia, że jest bezużyteczny.Jedynym rozwiązaniem, które przyszło mi do głowy, które zadziałało dla mnie, było nie używanie unii, a zamiast tego wykonywanie zapytań indywidualnie, a następnie zajmowanie się nimi. Zasadniczo więc nie używaj a,
Union
kiedy chceszOrder By
źródło
Używając kolejności osobno, każdy podzbiór uzyskuje porządek, ale nie cały zestaw, co chciałbyś połączyć dwa stoły.
Powinieneś użyć czegoś takiego, aby mieć jeden zamówiony zestaw:
SELECT TOP (100) PERCENT field1, field2, field3, field4, field5 FROM (SELECT table1.field1, table1.field2, table1.field3, table1.field4, table1.field5 FROM table1 UNION ALL SELECT table2.field1, table2.field2, table2.field3, table2.field4, table2.field5 FROM table2) AS unitedTables ORDER BY field5 DESC
źródło
Druga tabela nie może zawierać nazwy tabeli w
ORDER BY
klauzuli.Więc...
SELECT table1.field1 FROM table1 ORDER BY table1.field1 UNION SELECT table2.field1 FROM table2 ORDER BY field1
Nie zgłasza wyjątku
źródło
Jeśli to konieczne, aby zachować sortowanie wewnętrzne:
SELECT 1 as type, field1 FROM table1 UNION SELECT 2 as type, field1 FROM table2 ORDER BY type, field1
źródło
(SELECT FIELD1 AS NEWFIELD FROM TABLE1 ORDER BY FIELD1) UNION (SELECT FIELD2 FROM TABLE2 ORDER BY FIELD2) UNION (SELECT FIELD3 FROM TABLE3 ORDER BY FIELD3) ORDER BY NEWFIELD
Spróbuj tego. U mnie to zadziałało.
źródło
Dla Sql Server 2014/2012 / Inne (nie zaznaczone):
SELECT * FROM ( SELECT table1.field1 FROM table1 ORDER BY table1.field1 ) as DUMMY_ALIAS1 UNION ALL SELECT * FROM ( SELECT table2.field1 FROM table2 ORDER BY table2.field1 ) as DUMMY_ALIAS2
źródło