web-dev-qa-db-ja.com

SQLクエリ-UNIONでOrder Byを使用する

2つのテーブルからデータをプルするときに、プログラムでユニオンクエリをソートするにはどうすればよいですか?例えば、

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

例外をスローします

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

83

場合によっては、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
118
ajgreyling
SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1
64
Anne Porosoff

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

以下は、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節の列を参照する方が有利です。

この例では、「ORDER BY 2」で示されているように、結果をsupplier_name/company_nameで昇順でソートしました。

supplier_name/company_nameフィールドは、結果セットの位置#2にあります。

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

57
Anson Smith

具体例を使用して:

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
28
Ian Boyd

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句を配置できます。

17
Todd Price
(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 

作業?思考セットを覚えておいてください。ユニオンを使用して必要なセットを取得し、それに対して操作を実行します。

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

(エイリアスを使用)

4
MJ Latifi

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

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つのすべての作品でこれを試しました。

4
tlang

このコメントセクションを参照すると、質問に答える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_ALIAS2Selectステートメントで設定されたOrder Byをオーバーライドし、これが使用できなくなります。

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

2
Bubblesphere

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

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
Prayut Parsekar

順序を個別に使用することにより、各サブセットは順序を取得しますが、セット全体ではなく、2つのテーブルを結合する場合に使用します。

one順序セットを得るには、次のようなものを使用する必要があります。

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
1
Ernesto Morales

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

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

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

そう...

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

例外をスローしません

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
0
Bimal Das