84

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

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

例外をスローします

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

4

16 に答える 16

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
于 2010-08-03T07:35:38.403 に答える
64
SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1
于 2008-10-17T21:10:46.993 に答える
58

これはうまく説明できていると思います。

以下は、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

于 2008-10-17T21:18:06.887 に答える
29

具体的な例を使用して:

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
于 2011-09-16T13:45:40.710 に答える
17

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

于 2008-10-17T21:16:09.213 に答える
9
(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 

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

于 2008-10-17T21:11:07.947 に答える
5
SELECT table1Column1 as col1,table1Column2 as col2
    FROM table1
UNION
(    SELECT table2Column1 as col1, table1Column2 as col2
         FROM table2
)
ORDER BY col1 ASC
于 2008-10-17T21:31:03.477 に答える
4
SELECT field1
FROM ( SELECT field1 FROM table1
       UNION
       SELECT field1 FROM table2
     ) AS TBL
ORDER BY TBL.field1

(エイリアスを使用)

于 2011-06-12T03:10:12.850 に答える
4

これは私が今まで見た中で最も愚かなことですが、うまくいき、結果について議論することはできません.

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 つすべてが機能します。

于 2011-11-09T21:52:15.833 に答える
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
于 2011-10-08T22:07:40.697 に答える
2

このコメント セクションを参照すると、質問に答える 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_ALIAS1DUMMY_ALIAS2オーバーライドします。Order BySelect

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

于 2015-10-22T20:55:37.847 に答える
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
于 2012-01-24T17:07:32.137 に答える
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
于 2016-05-23T09:07:18.817 に答える
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

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

于 2015-07-14T18:20:01.983 に答える
0

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

そう...

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

例外をスローしません

于 2008-10-17T21:07:56.080 に答える