• ベストアンサー
  • 暇なときにでも

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
  • 回答数3
  • 閲覧数2366
  • ありがとう数2

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

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

とりあえず、解決はしているようですので、補足で書かれていた疑問について ■疑問1 ・ダミーと言うのは一般的な(よく利用する)手法でしょうか? →普通に使います。  ただし、Nullなどダミーを使わないほうのSelectで取得できない値にするのが普通です。 ■疑問2 ・SELECTする際、存在しないカラム名を文字列で指定すると「Unknown column」エラーになるのに、数字だとなぜエラーにならないのでしょうか? →固定の値と判断しているからです。  他に、固定の値を返す関数(例えば現在日時とか)やNullでもエラーにはなりません。 ■疑問3 …ダミーでSELECTする際の「ダミー指定方法」 ・「影響が少ないだろうと思われる存在カラム」を指定した方が良い? それとも、-1などの存在しないカラム(?)を指定した方が良い? もしくは気にする必要はない? →上記参照。 なお、以下のselectを実行してみるとより理解できるかも。 select 'A' as AText, 2 as BNumber from table1 table1の件数分、A 2 と出てきます。 select 'A' as AText, 2 as BNumber from table1 union select 'C' as AText, 4 as BNumber from table1 とするとtable1の件数分、A 2 とC 4が出てきます。(2倍の件数でるはずです。)

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

質問者からのお礼

回答ありがとうございました。 >Nullなどダミーを使わないほうのSelectで取得できない値にするのが普通 >固定の値と判断しているからです。 >他に、固定の値を返す関数(例えば現在日時とか)やNullでもエラーにはなりません ・初めて知りました ・大変参考になりましたー

その他の回答 (2)

  • 回答No.3

疑問2 についてさらに補足回答 存在しないカラム名はどんな場合もエラーです。データは空文字列やnullとして与えて as カラムエイリアスとするなら、存在しない名前もokです。 出力表示のカラム名は、最初のselect節で指定したものになるので、union 以降のselect節ではエイリアス名は無くてもよいですが、データ内容(固定値、存在するカラム値、計算値など)は必要です。

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

質問者からのお礼

回答ありがとうございました。 >存在しないカラム名はどんな場合もエラーです。データは空文字列やnullとして与えて as カラムエイリアスとするなら、存在しない名前もokです ・補足説明ありがとうございます ・勉強になります ・こういう細かい所をきちんと学んでいくのが大事なのだと改めて思いましたー

  • 回答No.1

後で別にSELECTするのでなくUNIONのついでに取りたいのなら、B側にダミーでageを付け加えてやったらどうでしょう。   SELECT \'A\' tablename, s.id, s.level, s.age FROM A s    UNION ALL   SELECT \'B\' tablename, r.group_id, r.level, -1 age FROM B r ダミーのageの値を何にするかは目的次第でしょうけど。 怒られるかな…。

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

質問者からの補足

回答ありがとうございました。 早速試したところ、無事目的の結果を得ることが出来ました。 出来たのですが、新たな疑問点が… >後で別にSELECTするのでなくUNIONのついでに取りたいのなら、 ・希望としては、UNION結果を取得した後で、SELECTしたかったのですが、特にこだわりがあるわけではありません(何となくこちらの方が一般的かなと思っただけです) >B側にダミーでageを付け加えてやったらどうでしょう ・こういう発想はなかったのですが、ダミーと言うのは一般的な(よく利用する)手法なのでしょうか? >ダミーのageの値を何にするかは目的次第でしょうけど ・今回、検索目的だったため、影響が少ないだろうと思われる存在カラム(r.id)を指定してみたのですが、それでもイけました ・「-1 age」て何だろうと思い、「-1」や「-2」にしてみたのですが、それでもイケました ・個数さえ合えば何だっていいのか、存在しないカラム名も指定できるのか、と思い、単純なSELECT文で色々試してみたのですが、数字以外だと、#1054 - Unknown column 'ダミー' in 'field list'エラーになりました ■疑問1 ・ダミーと言うのは一般的な(よく利用する)手法でしょうか? ■疑問2 ・SELECTする際、存在しないカラム名を文字列で指定すると「Unknown column」エラーになるのに、数字だとなぜエラーにならないのでしょうか? ■疑問3 …ダミーでSELECTする際の「ダミー指定方法」 ・「影響が少ないだろうと思われる存在カラム」を指定した方が良い? それとも、-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` という風に書いてみました、結果としてはよさそうですが 方法としては間違ってないでしょうか? 他にいい方法があればアドバイスをお願いします。

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

  • テーブル名をカラムとして取得する方法

    テーブル名をカラムとして取得する方法はありますでしょうか? オラクル8とVB6でプログラムを組んでいます。 例 TABLE Aの内容 カラム1 1 2 3 TABLE B カラム1の内容 4 5 6 SQLは簡略化してかきます。下記のSQLを実行した場合、 select A.カラム1 from A union select b.カラム1 from b 1 2 3 4 5 6 を取得できます。 例えば、上記で、SQL実行後、 下記のような値を取得したいです。 1 ,Aのテーブルだよ 2 ,Aのテーブルだよ 3 ,Aのテーブルだよ 4 ,Bのテーブルだよ 5 ,Bのテーブルだよ 6 ,Bのテーブルだよ それぞれのテーブルの名前を別名で結果に格納したいのです。 何か方法はありますでしょうか? なければ、unionせずに、2回SQLを発行し、それぞれに、 プログラム上で、「Aのテーブルだよ」を後で挿入したいと思っています。

  • SELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか

    SELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか? MYSQLサーバのバージョンは5.0.77です。 下記のように「*」を使用して指定テーブルの全カラムを表示する方法がありますが、 SELECT TableName.* FROM TableName 上記の逆で、指定テーブルの指定カラム以外の全カラムを一括指定って可能でしょうか? 例えば下記のような「^」みたいな、又は同等な書き方があれば良いなと思ってまして。 SELECT TableName.^ColumnName1 FROM TableName ちなみに、下記のように一つ一つ表示したいカラムを指定する方法以外です。 SELECT TableName.ColumnName2 , TableName.ColumnName3 FROM TableName よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 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で、特定カラムだけ結合前のカラム名を取得

    以下のようなSQLがあるとき、「best」カラムだけ、後で利用する際、「セレクト1」「セレクト2」何れのカラムから(どちらのテーブルから)取得したか知りたいのですが、どうすれば良いでしょうか? <SQL文例> SELECT id, tom, best, center, dragon  FROM (   SELECT m.id, m.tom, m.best1, m.center, u.dragon FROM main m ←セレクト1    LEFT JOIN usa u ON m.usa_id = u.id   UNION ALL   SELECT s.red_id, s.red_title, s.best2, s.center, u.dragon FROM sub s ←セレクト2    LEFT JOIN usa u ON s.usa_id = u.id  ) as PIYO <希望> 「id, tom, best, center, dragon」ではなく、 「id, tom, best1, center, dragon」+「id, tom, best2, center, dragon」で取得したい <質問> ・SQL生成の方法がおかしいのでしょうか? ・「セレクト1」「セレクト2」を2回実行して、どーにかして足せば良いのでしょうか? ・そもそもSQL側で足す、という考えが間違っているのでしょうか? この場合は2回実行して、スクリプト側で処理すべきなのでしょうか? <最終的にやりたいこと> ・「main」「sub」テーブルよりLIKE検索を行い、それぞれでヒットした該当レコードを取得したい ※UNIONを利用し、検索結果を両テーブルより取得表示するとこまでは出来たのですが、「main」「sub」何れから取得したか判断出来ないため、そこからリンクが貼れず、再考しています

    • ベストアンサー
    • MySQL
  • 別テーブルのカラムを利用してソートしたい

    別テーブルのカラムを利用してソートしたい MySQLバージョン4.1.16を使用しています。 テーブル「tbl1」をテーブル「tbl2」のcountというカラムを利用して ソートしたいのですが、どのようなSQL文になるのでしょうか? 「tbl2」のidというカラムは外部キーで「tbl1」のidと関係しています。 テーブル「tbl1」 +------+---------+ |   id |  userid  | +------+---------+ |  1  | tanaka  | |  2  | sato   | +------+---------+ テーブル「tbl2」 +------+---------+ |   id |  count  | +------+---------+ |  1  |   10  | |  2  |   3   | +------+---------+ 次のような文かなと思ったのですが、エラーが返ってきます・・・ SELECT * FROM tbl1 ORDER BY (SELECT id FROM tbl2 ORDER BY count)

    • ベストアンサー
    • MySQL
  • 同テーブルで指定カラム値を相互更新(入替)したい

    下記のようなカラムがある時、DBから取得した値を、引数(並べ替え順)に応じて、(同じカラムを)更新するSQL文を教えてください ●カラム id1 sex1 age1 id2 sex2 age2 id3 sex3 age3 id4 sex4 age4  ●引数例 3 1 2 ※1番目が3、2番目が1、3番目が2 ・「1の数字が付いたカラムの値」を、「3の数字が付いたカラムの値」で更新したい ・「2の数字が付いたカラムの値」を、「1の数字が付いたカラムの値」で更新したい ●質問 ・MySQLだけで処理可能でしょうか? UPDATE テーブル名 SET id1=(SELECT id3 FROM テーブル名 WHERE id1=id3値),sex2=(SELECT sex3 ……; ・それとも、一度、全ての値を取得して、PHP等で処理するのでしょうか? UPDATE テーブル名 SET id1=id3値,sex1=sex3値,age1=age3値,id2=id1値 ……; ・他に何か良い方法はあるでしょうか(一旦別テーブル作成後、戻す等) ●環境 MySQL5.1

    • ベストアンサー
    • MySQL
  • ユニオンクエリで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 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)) 宜しくお願いします。