2つのテーブルからデータをプルするときに、プログラムで和集合クエリを並べ替えるにはどうすればよいですか?例えば、
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
例外をスローします
注:これはMS AccessJetデータベースエンジンで試行されています
2つのテーブルからデータをプルするときに、プログラムで和集合クエリを並べ替えるにはどうすればよいですか?例えば、
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
例外をスローします
注:これはMS AccessJetデータベースエンジンで試行されています
回答:
場合によっては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
SELECT TOP 100 PERCENT
使用するためにサブクエリをに変更する必要がありORDER BY
ます
SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1
UNION
それが起こることを許可しません。それを行うための別の構成があるかもしれません。ないかもしれません。いずれにせよ、この答えは著者が求めていたものを技術的に達成しません。
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が指定されていないため、わかりません。
これは説明するのに良い仕事だと思います。
以下は、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です。
具体的な例を使用して:
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
dt
)を指定しないと、機能しません。そもそもその詳細を省略していて、SSMSによってスローされたエラーメッセージは特に役に立たないので、しばらくの間これに戸惑いました。
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句を配置できます。
(SELECT table1.field1 FROM table1
UNION
SELECT table2.field1 FROM table2) ORDER BY field1
作業?思考セットを忘れないでください。和集合を使用して必要なセットを取得し、それに対して操作を実行します。
これは私が今まで見た中で最も愚かなことですが、それは機能し、結果について議論することはできません。
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つすべての作業で試しました。
これはそれが行われる方法です
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
オーバーライドしますOrder By
Select
ステートメントでこれを使用できなくします。
私が考えることができた唯一の解決策は、和集合を使用せず、代わりにクエリを個別に実行してから処理することでした。だから基本的に、Union
あなたがしたいときに使用しないOrder By
順序を個別に使用することにより、各サブセットは順序を取得しますが、セット全体ではありません。これは、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
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