Comment trier par programme une requête Union lors de l'extraction de données à partir de deux tables? Par exemple,
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
Lève une exception
Remarque: ceci est tenté sur le moteur de base de données MS Access Jet
SELECT TOP 100 PERCENT
en afin de les utiliserORDER BY
dans une sous-requêteSELECT field1 FROM table1 UNION SELECT field1 FROM table2 ORDER BY field1
la source
UNION
ne permet pas que cela se produise. Il peut y avoir une autre construction pour le faire. Il se peut que non. Quoi qu'il en soit, cette réponse n'accomplit pas techniquement ce que l'auteur demandait.ORDER BY
fait partie d'un curseur, alors qu'ilUNION
fonctionne sur des tables, donc leur code ne peut pas fonctionner. Je ne vois pas comment vous pouvez déduire l'intention du PO à partir d'un code absurde. Considérez que SQLUNION
supprime les doublons: si ce sont vos «ensembles ordonnés de résultats»{1, 2, 3} UNION {2, 4, 6}
, le résultat serait-il{1, 2, 3, 4, 6}
ou{1, 3, 2, 4, 6}
? Nous ne savons pas car l'union des "ensembles ordonnés de résultats" n'est pas définie en ce qui concerne SQL et l'OP ne l'a pas spécifié.Je pense que cela 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;
Étant donné que 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 trié les résultats par
supplier_name
/company_name
dans l'ordre croissant, comme indiqué par "ORDER BY 2".Les champs
supplier_name
/company_name
sont en position n ° 2 dans le jeu de résultats.Tiré d'ici: http://www.techonthenet.com/sql/union.php
la source
En utilisant un exemple concret:
SELECT name FROM Folders ORDER BY name UNION SELECT name FROM Files ORDER BY name
Des dossiers:
Dossiers:
Sortie souhaitée: (résultats de la première sélection en premier, c'est-à-dire les dossiers en premier)
SQL pour obtenir 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
la source
dt
) ou cela ne fonctionnera pas. J'ai été perplexe pendant un moment car j'avais omis ce détail pour commencer et le message d'erreur généré par SSMS n'est pas particulièrement utile.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 juste être la dernière instruction, une fois que vous avez terminé votre union. Vous pouvez unir plusieurs ensembles ensemble, puis mettre une clause ORDER BY après le dernier ensemble.
la source
(SELECT table1.field1 FROM table1 UNION SELECT table2.field1 FROM table2) ORDER BY field1
Travail? N'oubliez pas de penser ensembles. Obtenez l'ensemble souhaité à l'aide d'une union, puis effectuez vos opérations dessus.
la source
SELECT table1Column1 as col1,table1Column2 as col2 FROM table1 UNION ( SELECT table2Column1 as col1, table1Column2 as col2 FROM table2 ) ORDER BY col1 ASC
la source
SELECT field1 FROM ( SELECT field1 FROM table1 UNION SELECT field1 FROM table2 ) AS TBL ORDER BY TBL.field1
(utilisez ALIAS)
la source
C'est la chose la plus stupide que j'aie jamais vue, mais cela fonctionne et vous ne pouvez pas discuter des 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 tout seul, mais comme une table dérivée fonctionne parfaitement bien. J'ai essayé ceci sur SS 2000, SS 2005, SS 2008 R2 et les trois fonctionnent.
la source
C'est comme ça que ça se 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
la source
En parcourant cette section de commentaires, je suis tombé sur deux modèles différents répondant à la question. Malheureusement pour SQL 2012, le deuxième modèle ne fonctionne pas, voici donc mon «travail»
Trier par sur une colonne commune
C'est le cas le plus simple que vous puissiez rencontrer. Comme de nombreux utilisateurs l'ont souligné, tout ce que vous avez à faire est d'ajouter un
Order By
à la fin de la requêteSELECT 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
Trier par sur différentes colonnes
C'est là que ça devient compliqué. En utilisant SQL 2012, j'ai essayé le premier article 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 bien compilé mais le
DUMMY_ALIAS1
etDUMMY_ALIAS2
écrasé leOrder By
établi dans l'Select
instruction qui le rend inutilisable.La seule solution à laquelle je pouvais penser, qui fonctionnait pour moi, était de ne pas utiliser de syndicat, mais plutôt de faire exécuter les requêtes individuellement et de les traiter ensuite. Donc, en gros, ne pas utiliser un
Union
quand vous le souhaitezOrder By
la source
En utilisant order séparément, chaque sous-ensemble obtient de l'ordre, mais pas l'ensemble complet, ce que vous souhaiteriez pour unir deux tables.
Vous devriez utiliser quelque chose comme ceci 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 source
La deuxième table ne peut pas inclure le nom de la table dans la
ORDER BY
clause.Donc...
SELECT table1.field1 FROM table1 ORDER BY table1.field1 UNION SELECT table2.field1 FROM table2 ORDER BY field1
Ne lève pas d'exception
la source
Si nécessaire pour conserver le tri intérieur:
SELECT 1 as type, field1 FROM table1 UNION SELECT 2 as type, field1 FROM table2 ORDER BY type, field1
la source
(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.
la source
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
la source