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

このQ&Aのポイント
  • 二つのテーブルをunionで繋いで、IDの昇順に並べ替えたいのですが、整数のID列は文字列にコンバートしました。
  • しかし、これでは整数のIDが正しく並べ替えられません。どのようにすれば望む結果を得ることができるでしょうか?
  • 正しい順序で並べ替えるための解決策を教えてください。
回答を見る
  • ベストアンサー

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 ↑こういう結果になるようにするにはどうしたら良いでしょうか?

noname#14004
noname#14004

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

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

convert(char(8),id) のかわりに right(" "+convert(varchar(8),id),8) にしてみては。(回答の表示では連続する空白が詰まって表示されてしまいますが、実際には、上記の【"】の間には空白が7個入ります。)

noname#14004
質問者

お礼

お礼の投稿を忘れていました。 (この掲示板の使い方がまだよくわからない。) xcrOSgS2wYさん、助かりました。 ありがとうございました。

noname#14004
質問者

補足

xcrOSgS2wYさん、さっそくのレスありがとうございます。 教えていただいた通りにやってみたらできました! select id from hoge union select right('    ' + convert(varchar(8), id), 8) hogehoge order by id ※この投稿を参考にされる方のために 上記SQL文の right(' '・・・の、''の間には、実際には半角スペースが7つ入ります。 (ブラウザが半角スペースを空白をひとつにしてしまうので全角を入れました。)

関連する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 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について

    お世話になっております。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
  • 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です。

  • 同じテーブルでの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)) 宜しくお願いします。

  • ユニオンクエリで0と表示される。

    教えてください。 4つのテーブルをユニオンクエリでひとつにしたく以下のようにSQLに書きました。 SELECT ID AS フィールド1 ,No AS フィールド2, Remark AS フィールド3 FROM テーブル1 UNION ALL SELECT ID,No,Remark FROM テーブル2 UNION ALL SELECT ID,No,Remark FROM テーブル3 UNION ALL SELECT ID,No,Remark FROM テーブル4 フィールド2のNOには数字が入っているのですがフィールド2の列にはすべて0と表示されて数字がででてきません。ID(オートナンバー型)とRemark(短いテキスト型)はちゃんと表示されます。もとのテーブル1と2のNoは数値型 テーブル3と4のNoは短いテキスト型です。なにが原因でどうしたら数値が表示されるようになりますか?

  • 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
  • ひらがなの検索結果が正常ではない

    初めての投稿です よろしくお願いします MySQLにてひらがなが入っているカラムでorder byしても予想に反します。文字コードが原因だとは思うのですが、MySQLの設定方法がよく分かっていません。ご指導、よろしくお願いします。 --- MySQLサーバーはLinux Windowsからターミナルにてテーブル作成、データ入力およびselectを実行 mysql> show columns from HOGE; +-----------+-------------+------+-----+ | Field | Type | Null | Key | +-----------+-------------+------+-----+ | id_c | int(11) | | PRI | | hoge_name | varchar(20) | YES | | +-----------+-------------+------+-----+ 2 rows in set (0.00 sec) mysql> select * from HOGE; +------+------------------+ | id_c | hoge_name | +------+------------------+ | 1 | あいうえお | | 2 | かきくけこ | | 7 | まみむめも | +------+------------------+ 11 rows in set (0.00 sec) mysql> select * from HOGE order by hoge_name; +------+------------------+ | id_c | hoge_name | +------+------------------+ | 7 | まみむめも | | 1 | あいうえお | | 2 | かきくけこ | +------+------------------+ 11 rows in set (0.00 sec)

    • ベストアンサー
    • MySQL
  • ユニオンクエリでWHERE句を使うのは不可能でしょうか?

    アクセス2003です。 (select * from Q1) UNION ALL (select * from Q2) UNION ALL (select * from Q3); WHERE (((番号) Like "*001")); としても 「SQLステートメントの後に文字が見つかりました。」 となってしまいます。 「番号」と言うフィールドは Q1、Q2、Q3どのクエリにもあり (select * from Q1) UNION ALL (select * from Q2) UNION ALL (select * from Q3); のみなら正常に動作します。 作成したユニオンクエリで「フィルタの対象」で「*001」と入力したらちゃんと思い通りに動作します。 ユニオンクエリで条件抽出は不可能でしょうか? よろしくお願いします。