SQL: 2010年2月アーカイブ

UNION で結合する表内で OREDER BY が使えない話なのだが。

ああ・・・今、ふと思ったが、単に ORDER BY したものをサブクエリにすればいいだけだ・・・

SELECT * FROM (SELECT * FROM table1 WHERE d1='B' ORDER BY d2) T1
UNION
SELECT * FROM (SELECT * FROM table1 WHERE d1='A' ORDER BY d2) T2
UNION
SELECT * FROM (SELECT * FROM table1 WHERE d1='C' ORDER BY d2) T3

ま、もう、プログラム内であれこれしてしまったので良いのだが。

ちなみに、UNION で結合する SELECT 文のサブクエリにはちゃんと名前をつけないと 'Every derived table must have its own alias' のエラーが出てしまうのでご注意を。

ありり?

UNION で結合する SELECT 文では ORDER BY って使えんのやったっけ?
エラーにはならないのだが、まったく無視されてるな・・・(^^;
もちろん、SELECT 文単体や、UNION した表全体に対する ORDER BY は問題なく使えるのだが。

UNION の場合、重複行を取るためのソートが表全体に対して行われるわけで、それで各表の ORDER BY は無視されるのかと思いきや、UNION ALL でも一緒やね。

はは。日頃 UNION 使わないもんで(^^;、細かい仕様知らなんだ。

A 003
A 001
A 002
B 102
B 101
C 310
C 320
...

みたいなテーブルから抽出したレコードを

B 101
B 102
A 001
A 002
A 003
C 310
C 320

みたいに並べたいんで(最初の項目の名前をd1、2番目の項目をd2とした場合)、

(SELECT * FROM table1 WHERE d1='B' ORDER BY d2)
UNION
(SELECT * FROM table1 WHERE d1='A' ORDER BY d2)
UNION
(SELECT * FROM table1 WHERE d1='C' ORDER BY d2)

としてたんだけど、

B 102
B 101
A 003
A 001
A 002
C 310
C 320

としか出んね。(テーブルに格納されている順番そのままに出てるだけ)

取りあえずソースが冗長化して格好悪いんだけど、来週にはテストをしたいんで、それぞれ個別に SELECT 実行してプログラム内で結合するようにするわ。

識者の方、良い SQL 文をご存じであればご教示ください。

このアーカイブについて

このページには、2010年2月以降に書かれたブログ記事のうちSQLカテゴリに属しているものが含まれています。

前のアーカイブはSQL: 2008年9月です。

次のアーカイブはSQL: 2013年2月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


2013年2月: 月別アーカイブ

月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら