• 締切済み

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)) 宜しくお願いします。

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

みんなの回答

noname#246547
noname#246547
回答No.1

UNION ALL がやりたいのは解るが、 UNIONを使用したい場合、どんな結果がほしいのか解らない。 UNIONを使用した場合は、 重複行を消すために、マージソート等でそれぞれのテーブルが勝手にソートされるので、無理かと。 つまり、UNIONを使用したい場合、あなたがどんな結果をほしいのかよく解らない。←補足要求 UNION ALLならば、 select * from (SELECT * FROM TBL_A ORDER BY 1, 2) UNION ALL select * from (SELECT * FROM TBL_B ORDER BY 2, 1) でいけそうだが・・・ 環境が無いので参考程度で!

v_rag_v
質問者

補足

返信遅れました。 marimari01さんありがとうございます。 題名/本文に「UNION / UNION ALL」と書いたのは ただUNIONの種類を記載しただけです。 分かりにくくてすみません。 おっしゃる通り「UNION ALL」をしたいので select * from (SELECT * FROM TBL_A ORDER BY 1, 2) UNION ALL select * from (SELECT * FROM TBL_B ORDER BY 2, 1) で試してみたいと思います。 ありがとうございました。

関連するQ&A

  • 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` という風に書いてみました、結果としてはよさそうですが 方法としては間違ってないでしょうか? 他にいい方法があればアドバイスをお願いします。

  • DB2で UNION ALL と GROUP BY の合わせ技のSQLの作り方

    DB2で下記SQLにグループ化して 合計やカウント数を出したいのですが、 うまくいきません --------------------------------------- SELECT A.NYU1 AS NYU ,0 AS SYU ,A.KEN1 AS KEN ,A.CODE1 AS CD From A ) UNION ALL ( SELECT 0 AS NYU ,B.SYU2 AS SYU ,B.KEN2 AS KEN ,B.CODE2 AS CD From B ) ORDER BY CD --------------------------------------- MS-ACCESSなら以下のような感じでうまくいくのですが。。。 SELECT SUM(NYU) AS A ,COUNT(SYU) AS B FROM ( SELECT F1 ,F2 FROM A UNION ALL SELECT G1,G2 FROM B ) GROUP BY NYU ご教授お願いします

  • 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
  • order by区の記述位置

    以下のようなsqlを書いた場合、 (入れ子になった内側でorderbyを記述している) 6行目に書いたorderbyの動作(ソートキーの降順に並ぶこと)は oracle,sql server等、各環境で保障されるのでしょうか? 以下の例ではうまく動作していたのですが(oracle) 入れ子が多くなった場合もうまくうごくのでしょうか? -------------------- select a.* from (   select a.ソートキー from テーブル a   union all   select a.ソートキー from テーブル b   order by ソートキー desc ) a -------------------- 自分は、order by は最後に書くものだと思っていたのですが、 たまたま上記のような入れ子になった内側でソートしているソースを見ることがあり みなさんにお話をうかがいたく質問させていただきました。 よろしくお願いいたします。

  • SQLで部分的にGROUP BYしたいとき(その2

    こんばんわ。 先日こちら(http://okwave.jp/qa/q7666702.html) で質問させていただきましたが、まだ問題があったため、 再度質問させていただきます。 以下のような20カラムある「出納帳」テーブルがあって、 同一日付の金額を集約してしまいたいです。 出納帳 ID 日付   金額 伝票 ・・・(全20カラム) 1 2012/8/20 1000 A01 ・・・ 2 2012/8/20 2000 A02 ・・・ 3 2012/8/21 -1000 B01 ・・・ 4 2012/8/21 -2000 B02 ・・・ 5 2012/8/22 3000 A03 ・・・ 6 2012/8/23 4000 A04 ・・・ 7 2012/8/24 -3000 B03 ・・・ 8 2012/8/24 -4000 B04 ・・・ 9 2012/8/27 5000 A05 ・・・ ↓「日付」で金額集約 ID 日付   金額 伝票 ・・・(全20カラム) 1 2012/8/20 1000 A01 ・・・ 2 2012/8/20 2000 A02 ・・・  2012/8/21 -3000    ・・・(-1000と-2000を集約) 5 2012/8/22 3000 A03 ・・・ 6 2012/8/23 4000 A04 ・・・  2012/8/24 -7000    ・・・(-3000と-4000を集約) 9 2012/8/27 5000 A05 ・・・ と集約キー以外はNULLにしたいのですが、 またまた、 ( SELECT ID, 日付, 金額, 伝票, ・・・ FROM  出納帳 WHERE  金額>=0 UNION ALL SELECT NULL, 日付, SUM(金額), NULL, ・・・ FROM  出納帳 WHERE  金額<0 GROUP BY 日付 ) ORDER BY 日付 とUNIONをする方法しか思いつかなかったのですが、 UNIONせずに端的に表現できるSQLはありますでしょうか?

  • UNIONする際、片方テーブルしかないカラムも利用

    UNIONする際、片方のテーブルしかないカラムも利用したいのですが、どうすればよいでしょうか? ■現状 SELECT tablename, id, level  FROM (   SELECT \'A\' tablename, s.id, s.level FROM A s    UNION ALL   SELECT \'B\' tablename, r.group_id, r.level FROM B r  ) as UNI ■やりたいこと ・テーブルAにしかないカラム「age」も一緒にSELECTしたいのですが、どうすれば良いでしょうか? ・UNIONしたいわけではなく、UNIONした後のレコード同様、「age」カラムもSELECTしたい、という意味です ・UNIONの外側で何かやればいいのかな、と思い試したのですが、うまくいきませんでした

    • ベストアンサー
    • MySQL
  • union allで空白を残す方法

    SQL Serverでunion allを使った時、空白を残す方法はありますでしょうか。 具体的には以下のようなケースです。 select 1 as A union all select '' as A の結果は A 1 0 というように自動的に0が入りますが、0ではなく空白にする方法を探しています。 ご存じの方教えていただけますでしょうか。 宜しくお願い致します。

  • SQL文について

    TBL_A カラム1 |カラム2 |カラム3 |カラム4 | ---------|---------|---------|---------| 1    |AAA   |N    |1    | ---------|---------|---------|---------| 2    |AAA   |G    |1    | ---------|---------|---------|---------| 3    |BBB   |N    |0    | ---------|---------|---------|---------| 4    |CCC   |N    |0    | ---------|---------|---------|---------| TBL_B カラム1 |カラム2 | ---------|---------| AAA   |2    | ---------|---------| BBB   |0    | ---------|---------| CCC   |1    | ---------|---------| 上記のテーブル、TBL_A、TBL_Bがあるとします。 TBL_Aからカラム3='N'を抽出し、TBL_Bのカラム2でソートしたいのですが、 可能でしょうか? 結果 ---------|---------| BBB   |0    | ---------|---------| CCC   |1    | ---------|---------| AAA   |2    | ---------|---------| …となって欲しいのですが。。。 select TBL_A.カラム2 from TBL_A, TBL_B where TBL_A.カラム3='N' order by TBL_B.カラム2 では、うまくいきませんでした。 ※ TBL_A、TBL_Bは共にカラム1がキー値です。

  • ユニオンクエリの保存方法

    SELECT * FROM 西クエリ UNION ALL SELECT * FROM 神戸クエリ; UNION ALL SELECT * FROM 東クエリ; UNION ALL SELECT * FROM 戸西クエリ; UNION ALL SELECT * FROM 西クエリ; UNION ALL SELECT * FROM 宮北クエリ; UNION ALL SELECT * FROM 尼クエリ; UNION ALL SELECT * FROM 馬クエリ; 以上のユニオンクエリを組みました これを ファイル名"森本"エクセルに保存したいのですが  命令文を指導願います

  • UNION ALLのように順番がありNULLを返す方法

    SQL初心者です。ACCESSデータベースに対するクエリを書いているのですが、 条件を配列として、その配列の順番に応じたSELECT文を書きたいのです。 SELECT * FROM access_db WHERE ID = '条件' UNION ALL SELECT * FROM access_db WHERE ID = '条件' UNION ALL SELECT * FROM access_db WHERE ID = '条件' UNION ALL... といった具合にSQL文を作成しているのですが、これでは見つからない条件がある場合に、行が繰り上がり条件を格納した配列とはずれが生じてしまいます。 見つからなかった場合にNULLまたはそれを表せる何かを抽出結果として組み込むことはできますか? SQL初心者のためUNION ALL程度しか近いものが見つけられなく、困っています。 どなたかよろしくお願いします。