• ベストアンサー
  • すぐに回答を!

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が利くようにするには どのようにすべきなのでしょうか? お忙しい中恐縮ですが、宜しくお願い申し上げます。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数2650
  • ありがとう数4

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

  • ベストアンサー
  • 回答No.1

>そんな印象があるのですが、UNIONを使う場合は、カラム名が同一でないと駄目なのでしょうか? テーブルのカラム名は何でもいいです。 エイリアス(別名)でカラム名を同じにすればよい事なので。 また、属性も同じである必要があります。 ところで、今、手元に MySQL がないので確認できないのですが、以下の書き方で MySQL はエラーにならないんでしたっけ? >SELECT name, address FROM member >UNION >SELECT c_name, c_address FROM class 普通はこのようにエイリアスでカラム名を合わせて書くのではないかと。。 ↓ SELECT name, address FROM member UNION SELECT c_name name, c_address as name FROM class >上記にあるように、テーブル名classのORDER BY c_no descが利くようにするには どのようにすべきなのでしょうか? インライビュー同士のUNIONではなく、UNIONのインラインビューでないとソートは効かないと思います。 (MySQLに限らず、ORACLEでもPostgreSQLでもMSSQLでも同様) これでどうでしょうか? ↓ SELECT v.no, v.name, v.address FROM ( SELECT no, name, address FROM member UNION SELECT c_no no, c_name name, c_address address FROM class ) v ORDER BY v.no desc

共感・感謝の気持ちを伝えよう!

質問者からのお礼

utakataXEX様 はじめまして。投稿後、早速の回答をありがとうございます! お恥ずかしい話でしょうが、エイリアスというのも初めてなので、このエイリアスに関してもちょっと調べておりました。 で、結果ですが・・最後にご提示いただきましたソースで正常に結果を返すことが出来ました!ありがとうございます。 >ところで、今、手元に MySQL がないので確認できないのですが、 >以下の書き方で MySQL はエラーにならないんでしたっけ? 少なくともこちらの環境では、質問時に記述したソースで結果を返すまでに至ってます。 ただ、ソート以外に、どうしてもうまくいかないものがあったのですが、エイリアスをお教え下さったおかげで、上手く結果を表示させることが出来ました。 以上、ご親切な対応に感謝いたします。ありがとうございました!

関連するQ&A

  • 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の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を使ってテストしています。

  • SQLの書き方

    select A.NO, A.NAME, count(B.TEN) FROM T1 A, T2 B GROUP BY A.NO ORDER BY 3 DESC 結果として以下のようになってほしいのですが、どのようにSQLを書けばよいのでしょうか? 結果 NO | NAME | TEN ---+------+----- 3 + 上村 + 40 1 + 吉田 + 11 2 + 浅野 + 6 T1テーブル NO | NAME ---+-------- 1 + 吉田 2 + 浅野 3 + 上村 T2テーブル NO | TEN ---+-------- 1 + 10 2 + 5 3 + 0 1 + 1 2 + 1 3 + 40

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

  • 複数のテーブルからデータを取得したい

    1つのテーブルから重複したデータを取り除いて表示するときに使う 【select distinct カラム名 from テーブル名;】 がありますよね。 それと同じようなことを複数のテーブルをまたいで行いたいのですがうまくいきません。 ちなみに両方のテーブルのカラム名は同じです。 【select distinct カラム名 from テーブル1 union select distinct カラム名 from テーブル2;】 としても重複を取り除いた後にテーブルを結合してるので結果的に両テーブルの重複した値を取り除くことができず。 そこで 【select distinct T1.カラム名, T2.カラム名 from テーブル1 T1. テーブル2 T2;】 としてみたのですが、クエリを実行中のまま反応がないので悩んでます。 ちなみに2つのテーブルのデータはそれぞれ2万件ほどです。 こういう時どういうsql文を組むのが正しいのでしょうか?

    • ベストアンサー
    • MySQL
  • 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 ↑こういう結果になるようにするにはどうしたら良いでしょうか?

  • 重複データからの取得方法を教えてください

    id s_no s_name ---------------- 1 001 aaaa 2 005 bbb1 3 005 bbb2 4 002 cccc 5 005 bbb3 6 005 bbb4 上のものがテーブルの内容です。取得したい結果が ---------------- 1 001 aaaa 4 002 cccc 5 005 bbb3 です。 試したSQLは select distinkd on (s_no) id,s_name from shain where id>=5 order by id desc select id,s_no,s_name from shain where id>=5 group by s_no order by id desc などです。 データベースがmdbなのでdistinkd onは使えませんでした。 もしかすると書式が違うのでしょうか?

  • 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
  • 複数のSELECT文の結合について

    $sql = "(SELECT * FROM hospytal WHERE shochi LIKE \"%$keyword%\") UNION (SELECT * FROM hospytal order by kuchikomi desc);"; // 口コミ数の降順 このSQL文は間違っているでしょうか。 やりたいことは、hospytalテーブルのshochiカラムでキーワードを含むものを、 降順にソートしたいのですが。 どうすればちゃんと動作するのか、ご教授お願い致します。

    • ベストアンサー
    • MySQL
  • 同じテーブルでの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と表示されてしまいます。 宜しくお願いいたします。