SQLクエリ-UNIONでOrder Byを使用する
-
03-07-2019 - |
質問
2つのテーブルからデータをプルするときに、プログラムで結合クエリをソートするにはどうすればよいですか?たとえば、
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
例外をスローします
注:これはMS Access Jetデータベースエンジンで試行されています
解決
UNION
と組み合わせる必要がある各セクションに ORDER BY
が必要な場合があります。
この場合
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
これは説明の良い仕事だと思います。
以下は、ORDER BY句を使用する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つの「選択」の間で列名が異なるため、ステートメントの場合、結果セット内の位置によってORDER BY句の列を参照する方が有利です。
この例では、 supplier_name
/ company_name
で結果を昇順で並べ替えました(" ORDER BY 2"で示されています)。
supplier_name
/ company_name
フィールドは、
結果セット。
具体的な例を使用する:
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
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;
すべての結合を行った後、ORDER BY句は最後のステートメントである必要があります。複数のセットを結合し、最後のセットの後にORDER BY句を配置できます。
(SELECT table1.field1 FROM table1
UNION
SELECT table2.field1 FROM table2) ORDER BY field1
仕事?思考セットを覚えておいてください。ユニオンを使用して必要なセットを取得し、操作を実行します。
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
(エイリアスを使用)
これは私が今まで見た中で最も愚かなことですが、動作し、結果について議論することはできません。
SELECT *
FROM (
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
) derivedTable
派生テーブルの内部はそれ自体では実行されませんが、派生テーブルは完全に機能します。これをSS 2000、SS 2005、SS 2008 R2、および3つのすべての作業で試しました。
これが行われる方法
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つの異なるパターンに出くわしました。悲しいことに、SQL 2012の場合、2番目のパターンは機能しません。そこで、「回避策」をここに示します
共通列の並べ替え
これは、最も簡単なケースです。多くのユーザーが指摘したように、本当に必要なのは、クエリの最後に 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_ALIAS1
および DUMMY_ALIAS2
は、 Select
ステートメントで設定された Order By
をオーバーライドします。これは使用できなくなります。
考えられる唯一の解決策は、ユニオンを使用せず、クエリを個別に実行してから処理することでした。したがって、基本的には、 Order By
Union
を使用しないでください。 順序を個別に使用することにより、各サブセットは順序を取得しますが、セット全体ではなく、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
2番目のテーブルには、 ORDER BY
句にテーブル名を含めることはできません。
そう...
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY field1
例外をスローしません
内部ソートを維持する必要がある場合:
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
これを試してください。それは私のために働いた。
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