SQLクエリ-UNIONでのOrderByの使用


83

2つのテーブルからデータをプルするときに、プログラムで和集合クエリを並べ替えるにはどうすればよいですか?例えば、

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

例外をスローします

注:これはMS AccessJetデータベースエンジンで試行されています

回答:


118

場合によってはORDER BY、と組み合わせる必要のある各セクションにを含める必要がありますUNION

この場合

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

1
order byが結果セットに影響を与える場合(Top xを使用する場合など)
James Barrass

これはまさに私が探しているものです!ありがとう!
Srichand Yella 2011

私にとってはうまく機能します...外側の選択にテーブルエイリアスがあることを確認する必要があります。それは私を噛んだ。
トロイ

Microsoft SQL Server Standard(64ビット)バージョン11.0.5058.0でこの構文を使用しても問題はありませんでした。
hlovdal 2015年

3
SSMSでは、サブクエリでSELECT TOP 100 PERCENT使用するためにサブクエリをに変更する必要がありORDER BYます
Joseph Nields 2015

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

18
これは、元の質問で論理的に求めていたものを技術的には達成しません。
イアン・ボイド

2
@Ian Boyd:私はあなたの主張を受け入れますが、彼らが求めていることは論理的に意味がありません。ユニオンはセットで動作し、セットには順序がありません!
2011

8
@onedaywhen元の作成者は、順序付けられた2つの結果セットを連結したいと考えています。UNIONそれが起こることを許可しません。それを行うための別の構成があるかもしれません。ないかもしれません。いずれにせよ、この答えは著者が求めていたものを技術的に達成しません。
イアン・ボイド

4
@Ian Boyd:SQLでは、ORDER BYはカーソルの一部ですが、UNIONテーブルを操作するため、コードは機能しません。不条理なコードからOPの意図を推測する方法がわかりません。SQLがUNION重複を削除することを考慮してください。これらが「順序付けられた結果のセット」である{1, 2, 3} UNION {2, 4, 6}場合、結果は{1, 2, 3, 4, 6}または{1, 3, 2, 4, 6}?「順序付けられた結果のセット」の和集合はSQLに関して未定義であり、OPが指定されていないため、わかりません。
2011

私はMYSQLを使用していますが、すべてのselectステートメントにフィールド(Orderingフィールド)を含めました。次に、最後にOrder by byを追加しましたが、問題なく動作します。
CreativeManix

57

これは説明するのに良い仕事だと思います。

以下は、ORDERBY句を使用するUNIONクエリです。

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;

2つの「select」ステートメント間で列名が異なるため、結果セット内の位置によってORDERBY句の列を参照する方が有利です。

この例では、「ORDER BY 2」で示されているように、結果をsupplier_name/company_nameで昇順で並べ替えています。

supplier_name/のcompany_nameフィールドは、結果セット内の位置#2です。

ここから取得:http//www.techonthenet.com/sql/union.php


28

具体的な例を使用して:

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

ファイル:

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

フォルダー:

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

必要な出力:(最初に選択した結果、つまり最初にフォルダ)

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

望ましい結果を達成するためのSQL:

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

3
これが断然ベストアンサーです
javier_domenech 2015年

1
これは素晴らしい答えです!
Ali Gonabadi 2016年

注-派生テーブルにエイリアスを指定する必要あります(この例ではdt)を指定しないと、機能しません。そもそもその詳細を省略していて、SSMSによってスローされたエラーメッセージは特に役に立たないので、しばらくの間これに戸惑いました。
CactusCake 2016年

17

Northwind2007の例を次に示します。

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;

すべての結合を完了した後、ORDERBY句を最後のステートメントにする必要があります。複数のセットを結合して、最後のセットの後にORDERBY句を配置できます。


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

作業?思考セットを忘れないでください。和集合を使用して必要なセットを取得し、それに対して操作を実行します。


並べ替えるフィールドの名前が異なる場合は、orderby句で順序値を使用することもできます
Anson Smith

5
SELECT table1Column1 as col1,table1Column2 as col2
    FROM table1
UNION
(    SELECT table2Column1 as col1, table1Column2 as col2
         FROM table2
)
ORDER BY col1 ASC

4
SELECT field1
FROM ( SELECT field1 FROM table1
       UNION
       SELECT field1 FROM table2
     ) AS TBL
ORDER BY TBL.field1

(ALIASを使用)


@DisplacedGuy MJが質問に対してより良い回答を持っている場合、上記のいずれかよりも優れています。この場合、受け入れられた回答に明らかに問題がある場合、MJはできるはずであり、新しい回答を残すことをお勧めします
MobileMon

そしてところで、MJの答えは最高です!(少なくとも私にとっては)
MobileMon

4

これは私が今まで見た中で最も愚かなことですが、それは機能し、結果について議論することはできません。

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

派生テーブルの内部はそれ自体では実行されませんが、派生テーブルは完全に正常に機能します。私はこれをSS2000、SS 2005、SS 2008 R2、および3つすべての作業で試しました。


2

これはそれが行われる方法です

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

2

このコメントセクションを閲覧すると、質問に答える2つの異なるパターンに出くわしました。残念ながら、SQL 2012の場合、2番目のパターンは機能しないため、これが私の「回避策」です。


共通の列でOrderBy

これはあなたが遭遇することができる最も簡単なケースです。多くのユーザーが指摘しているように、本当に必要なOrder Byのはクエリの最後にを追加することだけです

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

または

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

異なる列での並べ替え

ここで実際に注意が必要です。SQL 2012を使用して、一番上の投稿を試しましたが、機能しません。

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 * 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

このコードはコンパイルされましたが、で確立されたものDUMMY_ALIAS1DUMMY_ALIAS2オーバーライドしますOrder BySelectステートメントでこれを使用できなくします。

私が考えることができた唯一の解決策は、和集合を使用せず、代わりにクエリを個別に実行してから処理することでした。だから基本的に、Unionあなたがしたいときに使用しないOrder By


1

順序を個別に使用することにより、各サブセットは順序を取得しますが、セット全体ではありません。これは、2つのテーブルを結合する必要があるものです。

次のようなものを使用して、1つの順序集合を作成する必要があります。

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

0

2番目のテーブルでは、ORDER BY句にテーブル名を含めることはできません。

そう...

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

例外をスローしません


これはなんて良い質問でした。お使いのバージョンまたはネストされたバージョンが目的の結果を返すかどうかわかりますか?または、両方とも同じ結果を返しますか?もしそうなら、(他の人の)ネストされたソリューションは、ORDER BYを1回しか実行しないため、パフォーマンスが向上しますか?
DOK

Jetエンジンのパフォーマンス上の利点はわかりませんが、ネストによって読みやすさが向上したと思います。
Curtis Inderwiesche 2008年

0

内部ソートを維持する必要がある場合:

SELECT 1 as type, field1 FROM table1 
UNION 
SELECT 2 as type, field1 FROM table2 
ORDER BY type, field1

0
(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

これを試して。それは私のために働いた。


0

SQL Server 2014/2012 /その他(チェックなし)の場合:

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

これを試してみると、2012年にコンパイルエラーが発生します。スクリプトはストアドプロシージャでは機能しません。top句が必要です。
ティモシードゥーリング2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.