OracleのUnion内でそれぞれのOrderBy結果を反映する方法

このQ&Aのポイント
  • OracleのUnion内で、それぞれのOrderBy結果を反映する方法について解説します。
  • AテーブルからBの昇順でデータを取得する際、特定のコードを先頭に持って来る方法を考えます。
  • 具体的なクエリの例として、「金融機関テーブル(BANK)を金融機関コード(BANK_CK)の昇順で並び替えるが、全銀の'9999'を先頭に持って来たい」という要件を解決する方法を紹介します。
回答を見る
  • ベストアンサー

OracleのUnion内でそれぞれのOrderBy結果を反映する方法

OracleのUnion内でそれぞれのOrderBy結果を反映する方法について AテーブルからデータをBの昇順で一覧を取得する際、Bの特定のコードを先頭に持ってこようとしています。 例)金融機関テーブル(BANK)を金融機関コード(BANK_CK)の昇順で並び替えるが、全銀の'9999'を先頭に持って来たい。 (SELECT BANK_CD FROM BANK WHERE BANK_CD = '9999') UNION (SELECT BANK_CD FROM BANK WHERE BANK_CD <> '9999' ORDER BY BANK_CD); としてしまうと、「ORA-00907: 右カッコがありません。」のエラーとなります。 SELECT 0 "PRE_KEY", BANK_CD FROM BANK WHERE BANK_CD = '9999' UNION SELECT 1 "PRE_KEY", BANK_CD FROM BANK WHERE BANK_CD <> '9999' ORDER BY PRE_KEY, BANK_CD; としてやると、値は並び変わりますが、いらない"PRE_KEY"が取れてしまいます。 BANK_CDだけ取得する方法はありますでしょうか?oracle11gです。

  • Oracle
  • 回答数1
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • dda167
  • ベストアンサー率76% (55/72)
回答No.1

SELECT BANK_CD FROM BANK ORDER BY CASE WHEN BANK_CD = '9999' THEN 0 ELSE 1 END, BANK_CD; # 未検証です

sho_1982
質問者

お礼

ありがとうございます。 期待した結果が取得できました。

関連するQ&A

  • SQLのUNIONを使って…

    SQLでUNIONを使ったあるメソッドがあります。 まずは、例を見せます。 SELECT '1' AS ID, '' AS 名前, FROM 情報 UNION SELECT ID, 名前 FROM 情報 ORDER BY ID 二つのテーブルを合体させた後、 IDを昇順に変更します。 しかし、「'1'のID」に限りレコードの最下部に表示したい。 ID順に並べ替えると最小値である'1'は当然、最上部に出ますが、 これを最下部にする事が目的です。 また、UNIONの上下にあるSELECT文を 互いに入れ替える等は禁止となっています。 環境は、オラクル10G。 CSEを使ってテストしています。

  • UNIONで繋いだ結果セットの並べ替え

    二つのテーブルをunionで繋いで、IDの昇順に並べ替えたいのですが、それぞれID列の型が違うので(文字列と整数)整数のID列は文字列にコンバートしました。 select id from hoge union select convert(char(8),id) from hogehoge order by id ところがこれだと、もともと整数だった方のIDは、 1 10 100 2 20 200 と並んでしまいますよね。 1 2 3 ・ ・ ・ a001 a002 a003 ↑こういう結果になるようにするにはどうしたら良いでしょうか?

  • UNIONについて

    お世話になっております。UNIONについて伺いたいことあり質問させていただきます。(MySQL5.1系) 2つのテーブルがあり、縦に?検索したくUNIONを使ってSQL文を作ってみました。 この検索対象となる2つのテーブルは構成も違えば、カラム名も違うのですが、 SELECT name, address FROM member UNION SELECT c_name, c_address FROM class とこのようにしたら欲していた結果を得ることが出来ました。 そ、ここで質問なのですが、今回、UNIONを使うのは初めてなのですが、色々と調べていると、 UNIONを使うときは、カラム名が同一なものが条件のように書かれているものが多くあり、 多くのサイトのサンプルソースを見てみると、以下のようにカラム名が同一なものばかりと、 そんな印象があるのですが、UNIONを使う場合は、カラム名が同一でないと駄目なのでしょうか? SELECT name, address FROM member UNION SELECT c_name, c_address FROM class また、もう1点伺いたいのですが、UNIONを使い、ORDER BYを場合、以下のように SELECT文ごとにカッコで括るとも調べたのですが、結果は何も変わらない状態になっています。 (SELECT no, name, address FROM member ORDER BY no desc) UNION (SELECT c_no, c_name, c_address FROM class ORDER BY c_no desc) 上記にあるように、テーブル名classのORDER BY c_no descが利くようにするには どのようにすべきなのでしょうか? お忙しい中恐縮ですが、宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • UNION ALLしたテーブルを個別に並べ変え

    table1、table2、table3というテーブルがあり このそれぞれをidというカラムで並び替えたものを結合するので考えました。 SELECT * FROM `table1` UNION ALL SELECT * FROM `table2` UNION ALL SELECT * FROM `table3` ORDER BY `id` にすると全てを結合したものを並び替えるので SELECT *, '1' AS tbl FROM `table1` UNION ALL SELECT *, '2' AS tbl FROM `table2` UNION ALL SELECT *, '3' AS tbl FROM `table3` ORDER BY `tbl`,`id` という風に書いてみました、結果としてはよさそうですが 方法としては間違ってないでしょうか? 他にいい方法があればアドバイスをお願いします。

  • 同じテーブルでのUNION

    テーブルtableである列aのデータが1,2,3,4,5,6,7,8,9と 入っていたとします。 このテーブルを1,2,5,3,4,6,7,8,9という順番で SELECTしたい場合はどのようにすればよろしいでしょうか? select a from table where a IN (1,2) union select a from table where a = 5 union select a from table where a NOT IN (1,2,5) としてみたのですが1,2,3,4,5,6,7,8,9と表示されてしまいます。 宜しくお願いいたします。

  • UNION / UNION ALL 時のORDER BY について

    初めて質問させていただきます。 表A(以下,TBL_A) と 表B(以下,TBL_B)があり,表名が 異なるだけでカラムの項目数,データ型は一致していてそれぞれ [TBL_A] SELECT * FROM TBL_A ORDER BY 1, 2 [TBL_B] SELECT * FROM TBL_B ORDER BY 2, 1 を UNION / UNION ALL したいのですが,上記のように ORDER BY が異なっている場合にはどのようにすれば いいのでしょうか? 苦戦中の成果物としてはそれぞれに固有の区分カラムを設け, その区分で判断し DECODE で ORDER BY しようとしたのですが 「"右カッコがありません"」と出て行き詰っています。 SELECT 区分, ○○, □□ FROM TBL_A WHERE ○○ = ??? UNION ALL (SELECT 区分, ○○, □□ FROM TBL_B) ORDER BY 区分, DECODE(区分,A,(1,2),B,(2,1)) 宜しくお願いします。

  • ユニオンクエリで期間指定抽出のSQL記述について

    いつもお世話になっております。 Access 2007で、「人名集計」テーブルと「資料送付」テーブルがあり、それぞれ、同一のフィールド名でテーブルが作成されております。 これを「発送日」フィールドの昇順で並べ替えながら結合するユニオンクエリを作成しました。 SELECT * FROM 人名集計 UNION ALL SELECT * FROM 資料送付 ORDER BY 発送日; とりあえず、上記のSQLでは動いていますが、このSQLに、 「発送日」の期間を指定して、抽出条件(パラメータ)を加えようとしていますが、うまくいきません。 WHERE句を使って、Between 「最初の日付を入力」 And 「最後の日付を入力」 のような文を SQLの何処にどのように記述すればよいのか、教えてください。 宜しくお願い申し上げます。

  • sqlのwhereで指定した条件の前後を取得したい

    テーブル=T) KEY DATA 001 あ 002 い 003 う 004 え 005 お SQL) SELECT DATA FROM T WHERE KEY = 003 ; 上記のSQLでは、「う」のデータしか取得できませんが、 「003」の前後1件、合計3件の「い」「う」「え」を取得する方法を教えて下さい。 ちなみに、 SELECT DATA FROM T WHERE KEY >= 003 AND ROWNUM <= 2 と SELECT * FROM ( SELECT DATA FROM T WHERE KEY < 003 ORDER BY KEY DESC ) WHERE ROWNUM < 1 のUNIONでは上手く行きませんでした。 よろしくお願いします。

  • oracleでwith句の結果を使ってupdate

    oracleでwith句の結果を使って外部結合?でupdateしたいのですが 上手くいきません。 oracleでは無理なのでしょうか。 よろしくお願いいたします、。 /*---------- with v1 as ( select row_number() over(PARTITION BY ・・・ ORDER BY ・・・) as rnum ,no ,col1 ,・・・ from ・・・ ) update ( select A.col1 A_COL, v1.col2 B_COL from table1 A inner join table2 B on A.cd1=B.cd1 inner join v1 on A.no=v1.no where v1.rnum=1 and ・・・ ) set A_COL=B_COL ; ----------*/ と書いたのですが、 実際に実行してみると、 カッコ「(」、「)」がないとか、 selectが必要とか, A_COLやB_COLが無効ですとか、 となります。 どこが悪いのでしょうか。 oracleではupdateでwithは使えないのでしょうか。 よろしくお願いします。

  • 副照会を簡単に使いまわせますか?

    たとえば、次のSQLがあったとして、 select キー1, キー2, sum(金額) (  select A.キー1 , A.キー2 , A.金額   from (select * from ~ where ...) A  union all  select '' , A.キー2 , A.金額   from (select * from ~ where ...) A  union all  select A.キー1 , '' , A.金額   from (select * from ~ where ...) A  union all  select ''   , '' , A.金額   from (select * from ~ where ...) A ) group by キー1, キー2 一番内側の副照会は、 (select * from ~ where ...) A は、4箇所とも同じSQL文で、とても長いのですが 2箇所目以降は、1箇所目と同じSQL文ということで 記述を省けたりするような構文があったりしないでしょうか? そこを、ビューにしろといわれるとその通りなのですが ビューにしたくないです。(プログラムで動的にここの副照会部分を パラメータに応じて作っているので、ビューにするとビューがいくつも できて、きりがない) Oracle9iで、利用しています。