プロが教える店舗&オフィスのセキュリティ対策術

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の外側で何かやればいいのかな、と思い試したのですが、うまくいきませんでした

A 回答 (3件)

とりあえず、解決はしているようですので、補足で書かれていた疑問について



■疑問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倍の件数でるはずです。)
    • good
    • 2
この回答へのお礼

回答ありがとうございました。

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

お礼日時:2013/03/06 00:13

疑問2 についてさらに補足回答


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

回答ありがとうございました。

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

お礼日時:2013/03/06 00:17

後で別に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などの存在しないカラム(?)を指定した方が良い? もしくは気にする必要はない?

補足日時:2013/02/24 10:09
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A