Frage

Wie kann man programmatisch eine Union-Abfrage sortieren, wenn Daten aus zwei Tabellen ziehen? Zum Beispiel:

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

Löst eine Ausnahme

Hinweis: Diese auf MS Access Jet Datenbank-Engine versucht wird

War es hilfreich?

Lösung

Manchmal brauchen Sie die ORDER BY in jedem der Abschnitte haben, die mit UNION kombiniert werden müssen.

In diesem Fall

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

Andere Tipps

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

Ich denke, das macht einen guten Job zu erklären.

Das folgende ist eine UNION-Abfrage, die eine ORDER BY-Klausel verwendet:

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;

Da die Spaltennamen unterscheiden zwischen den beiden „Select“ Aussagen, ist es vorteilhafter, die Spalten in der ORDER BY-Klausel durch ihre Position in der Ergebnismenge zu verweisen.

In diesem Beispiel haben wir die Ergebnisse von supplier_name / company_name aufsteigend sortiert, als "BY 2 ORDER" durch die bezeichnet.

Die supplier_name / company_name Felder sind in Position # 2 in der Ergebnismenge.

von hier genommen: http://www.techonthenet.com/sql/union.php

ein konkretes Beispiel für die Verwendung:

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

Dateien:

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

Ordner:

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

gewünschte Ausgabe: (Ergebnisse der ersten wählen Sie zuerst, das heißt Ordner zuerst)

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

SQL die gewünschten Ergebnisse zu erzielen:

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

Hier ist ein Beispiel von Nordwind 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;

Die ORDER BY-Klausel muss nur die letzte Anweisung sein, nachdem Sie alle Ihre unioning getan haben. Sie können union mehr Sätze zusammen, dann eine ORDER BY-Klausel setzen nach dem letzten Satz.

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

arbeiten? Denken Sie daran denken Sets. Holen Sie sich das Set Sie wollen eine Vereinigung mit und führen Sie Ihre Operationen auf sie.

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

(Verwendung ALIAS)

Das ist das Dümmste, was ich je gesehen habe, aber es funktioniert, und Sie können nicht mit den Ergebnissen argumentieren.

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

Das Innere der abgeleiteten Tabelle wird nicht von selbst ausführen, sondern als eine abgeleitete Tabelle arbeitet völlig in Ordnung. Ich habe versucht, dies auf der SS 2000, SS 2005, SS 2008 R2, und alle drei Arbeiten.

Dies ist, wie es gemacht wird

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

Browsing diesen Kommentar Abschnitt I accross zwei verschiedenen Mustern kam die Frage zu beantworten. Leider für SQL 2012 ist das zweite Muster nicht funktioniert, so ist hier meine „Arbeit um“


Sortierung nach auf einer gemeinsamen Spalte

Dies ist der einfachste Fall auftreten kann. Wie viele Benutzer darauf hingewiesen, alles, was Sie wirklich tun müssen, ist einen Order By am Ende der Abfrage hinzufügen

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

oder

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

Sortierung nach auf verschiedene Spalten

Hier ist, wo es wirklich schwierig wird. Verwendung von SQL 2012, habe ich versucht, die oberen Pfosten und es funktioniert nicht.

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

Nach dem recommandation im Kommentar, den ich schon versucht, diese

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

Dieser Code hat kompilieren, aber die DUMMY_ALIAS1 und DUMMY_ALIAS2 die Order By in der Select Anweisung festgelegt außer Kraft setzen, die diese unbrauchbar macht.

Die einzige Lösung, die ich denken konnte, die für mich gearbeitet wurde nicht eine Vereinigung mit und stattdessen machen die Abfragen laufen einzeln und dann den Umgang mit ihnen. Also im Grunde keine Union verwenden, wenn Sie auf Order By wollen

Durch die Verwendung von separat bestellen jede Teilmenge erhält Auftrag, aber nicht das ganze Set, das ist, was Sie zwei Tabellen vereinigen wollen.

Sie sollten so etwas wie diese verwenden haben ein geordnete Menge:

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

Die zweite Tabelle kann nicht der Tabellennamen in der ORDER BY Klausel enthalten.

So ...

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

Ist keine Ausnahme aus

Wenn notwendig, die innere Sortierung zu halten:

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

Versuchen Sie dies. Er arbeitete für mich.

für SQL Server 2014/2012 / Sonstiges (Nicht markiert):

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top