Requête SQL – Utilisation de Order By dans UNION

Comment peut-on sortinger par programmation une requête d’union lors de l’extraction des données de deux tables? Par exemple,

SELECT table1.field1 FROM table1 ORDER BY table1.field1 UNION SELECT table2.field1 FROM table2 ORDER BY table2.field1 

Lance une exception

Remarque: cette opération est en cours sur le moteur de firebase database MS Access Jet

Parfois, vous devez avoir l’ ORDER BY dans chacune des sections qui doivent être combinées avec UNION .

Dans ce cas

 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 
 SELECT field1 FROM table1 UNION SELECT field1 FROM table2 ORDER BY field1 

Je pense que ça explique bien.

Voici une requête UNION qui utilise une clause 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; 

Comme les noms de colonne sont différents entre les deux instructions “select”, il est plus avantageux de référencer les colonnes de la clause ORDER BY par leur position dans le jeu de résultats.

Dans cet exemple, nous avons sortingé les résultats par company_name / company_name en ordre croissant, comme indiqué par “ORDER BY 2”.

Les champs company_name / company_name sont en position # 2 dans le jeu de résultats.

Tiré d’ici: http://www.techonthenet.com/sql/union.php

En utilisant un exemple concret:

 SELECT name FROM Folders ORDER BY name UNION SELECT name FROM Files ORDER BY name 

Des dossiers:

 name ============================= RTS.exe thiny1.etl thing2.elt f.txt tcpdump_sortingal_license (1).zip 

Dossiers:

 name ============================ Contacts Desktop Downloads Links Favorites My Documents 

Sortie souhaitée: (résultats de la première sélection en premier, à savoir les dossiers en premier)

 Contacts Desktop Downloads Favorites Links My Documents f.txt RTMS.exe tcpdump_sortingal_license (1).zip thiny1.etl thing2.elt 

SQL pour atteindre les résultats souhaités:

 SELECT name FROM ( SELECT 1 AS rank, name FROM Folders UNION SELECT 2 AS rank, name FROM Files) dt ORDER BY rank, name 

Voici un exemple de 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; 

La clause ORDER BY doit simplement être la dernière déclaration, après avoir effectué toute votre union. Vous pouvez regrouper plusieurs ensembles, puis placer une clause ORDER BY après le dernier ensemble.

 (SELECT table1.field1 FROM table1 UNION SELECT table2.field1 FROM table2) ORDER BY field1 

Travail? Rappelez-vous des ensembles de reflection. Obtenez le jeu que vous voulez en utilisant une union, puis effectuez vos opérations dessus.

 SELECT table1Column1 as col1,table1Column2 as col2 FROM table1 UNION ( SELECT table2Column1 as col1, table1Column2 as col2 FROM table2 ) ORDER BY col1 ASC 
 SELECT field1 FROM ( SELECT field1 FROM table1 UNION SELECT field1 FROM table2 ) AS TBL ORDER BY TBL.field1 

(utiliser ALIAS)

C’est la chose la plus stupide que j’ai jamais vue, mais ça marche, et vous ne pouvez pas discuter avec les résultats.

 SELECT * FROM ( SELECT table1.field1 FROM table1 ORDER BY table1.field1 UNION SELECT table2.field1 FROM table2 ORDER BY table2.field1 ) derivedTable 

L’intérieur de la table dérivée ne s’exécutera pas seul, mais une table dérivée fonctionne parfaitement. J’ai essayé ceci sur SS 2000, SS 2005, SS 2008 R2, et les trois travaux.

Voilà comment c’est fait

 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 

En parcourant cette section de commentaires, je suis tombé sur deux motifs différents répondant à la question. Malheureusement pour SQL 2012, le deuxième modèle ne fonctionne pas, alors voici mon “travail autour de”


Commander par une colonne commune

C’est le cas le plus simple que vous pouvez rencontrer. Comme de nombreux utilisateurs l’ont souligné, il vous suffit d’append un Order By à la fin de la requête.

 SELECT a FROM table1 UNION SELECT a FROM table2 ORDER BY field1 

ou

 SELECT a FROM table1 ORDER BY field1 UNION SELECT a FROM table2 ORDER BY field1 

Commander sur différentes colonnes

Voici où ça devient vraiment difficile. En utilisant SQL 2012, j’ai essayé le post supérieur et cela ne fonctionne pas.

 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 

Suite à la recommandation dans le commentaire j’ai essayé ceci

 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 

Ce code a été compilé, mais DUMMY_ALIAS1 et DUMMY_ALIAS2 remplacent la Order By établie dans l’instruction Select , ce qui la rend inutilisable.

La seule solution à laquelle je pouvais penser, celle qui fonctionnait pour moi, n’était pas d’utiliser une union et de faire en sorte que les requêtes soient exécutées individuellement et qu’elles les traitent ensuite. Donc, fondamentalement, ne pas utiliser une Union lorsque vous voulez Order By

En utilisant l’ordre séparément, chaque sous-ensemble obtient l’ordre, mais pas l’ensemble, ce qui est ce que vous souhaitez unir deux tables.

Vous devriez utiliser quelque chose comme ça pour avoir un ensemble ordonné:

 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 

La seconde table ne peut pas inclure le nom de la table dans la clause ORDER BY .

Alors…

 SELECT table1.field1 FROM table1 ORDER BY table1.field1 UNION SELECT table2.field1 FROM table2 ORDER BY field1 

Ne lance pas d’exception

Si nécessaire pour garder le sorting interne:

 SELECT 1 as type, field1 FROM table1 UNION SELECT 2 as type, field1 FROM table2 ORDER BY type, field1 
 (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 

Essaye ça. Cela a fonctionné pour moi.

Pour SQL Server 2014/2012 / Autres (non vérifié):

 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