• ベストアンサー

構造が異なる二つのテーブルをunionで結ぶには?

構造が異なる二つのテーブルをUNION(問い合わせの結合)したいのですが, 対応しないカラムの分だけ "length('') as user_id"などとして ダミーカラムを作り,無理やり結合する方法を取っています. もっとスマートに UNIONする方法はないのでしょうか?

  • MySQL
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • mickymac
  • ベストアンサー率37% (90/240)
回答No.2

cとfとが関係ないのであれば、 (SELECT b AS a1 , c AS a2, '' AS a3 FROM A ORDER BY a1) UNION (SELECT b AS a1, '' AS a2, f AS a3 FROM B ORDER BY a1) ORDER BY a1; でいいのかな?

tx_train
質問者

補足

'' AS a2 で良かったんですね. これで,ちょっとスマートなクエリになりました. ありがとうございました.

その他の回答 (1)

  • mickymac
  • ベストアンサー率37% (90/240)
回答No.1

必要なカラムの分だけSELECTしたものを結合するのは だめなんでしょうか? SELECT a1, a2 FROM A WHERE a3 = 'hoge' UNION SELECT b1 AS a1, b2 AS a2 FROM B WHERE b3 = 'hoge'

tx_train
質問者

補足

それが,お互いに持っていないカラムがありまして. A tableには a, b, c, d B tableには b, d, e, f この場合に b, c, fのカラムを取り,bでソートをかけたいというのイメージです.

関連する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する際、片方テーブルしかないカラムも利用

    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を使って2つのテーブルの値を算出

    仮に以下2つのテーブルがあったとします。 (両方とも、JOINなどで結合されたテーブルです) tableA |id|nedan|jitubai| |01|1000|900| |02|1500|1000| |03|2300|2000| tableB |id|nedan|jitubai| |01|1500|1300| |02|1500|1200| |03|2300|2200| この2つをUNIONALLで結合すると以下のようになると思うのですが、 |id|nedan|jitubai| |01|1000|900| |02|1500|1000| |03|2300|2000| |01|1500|1300| |02|1500|1200| |03|2300|2200| これを何とかして、idを軸にnedanカラム、jitubaiカラムの値を足して出したいのです。以下の感じです。 |id|nedan|jitubai| |01|2500|2200| |02|3000|2300| |03|4600|4200| どうすれば良いのでしょうか……。 何か良い知恵をお借りできれば、と思っています。 宜しくお願い致します。

  • 2テーブルが同じユーザテーブル参照するときの結合

    2つのテーブルで、同じユーザテーブルを参照してデータ取得したいのですが、 どうやって結合すれば良いのでしょうか? ■概要 ・ユーザがアクションに挑戦すると、結果を表示 ・その際、「アクション作成者」と「アクション挑戦者(ユーザ)」を表示したい ※「作成者」「挑戦者」は、同じ「user」テーブルで管理したい ■3テーブル ・「result」「action」「user」 ・「result」「action」テーブルには、それぞれ「user_id」カラムがある ・「result」テーブルには、「action_id」カラムがある。1対多? ■知りたいこと ・一気にまとめて一覧として取得する方法 ・最終的に「結果」と、「result」「action」それぞれに対応した「user」テーブルの「name」カラムを取得したい ■試してみたこと ・これだと「挑戦者名」が取得できない       SELECT *        FROM result r         LEFT JOIN `action` a ON r.`action_id` = a.`id`         LEFT JOIN `user` u ON r.`user_id` = u.`id` ・これだと「挑戦者」のユーザIDしか取得できない       SELECT *,a.user_id AS actionuser_id        FROM result r         LEFT JOIN `action` a ON r.`action_id` = a.`id`         LEFT JOIN `user` u ON a.`user_id` = u.`id`

    • ベストアンサー
    • 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やJOINがありますが

    テーブルを結合する構文はUNIONやJOINがありますが この場合クエリー速度は1本のテーブルと複数のテーブルではどの程度 違うのでしょうか? また物理的に複数のテーブルを1つにしたい場合に何かいい方法は ないでしょうか。

    • ベストアンサー
    • MySQL
  • unionでマージした副問合せを結合

    2つの表をunionでマージした結果を副問合せで使用し、この副問合せを他の表とwhereで結合するとORA-00918: 列の定義が未確定です。がでます。こんな感じです。 副問合せそのものは単独で実行してもエラーにならないので結合に問題があるようです。 どなたか回答お願いします。行き詰っています。 select as.xx1,asxx2 from (select * from aa union select * from bb) as, af where as.xx1=af.xx1;

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

  • アクセスログテーブルの構造について

    このジャンルでお願いします。 よくアクセスログの解析を無料で(リンクを貼ったりして)行ってくれるサービスがありますが、 そのデータベースの構造というかテーブルの構造はどのようになっているのでしょうか? 例えば、膨大なレコード数になると思うので それを利用するユーザー毎にテーブルを分けるとかするのでしょうか? あるいはユーザー毎、年毎、月毎、日毎、に分けるとか? 本来ならテーブルを分割したりするのは違うんじゃないかなぁと思ったりするのですが、 なので次のように、 CREATE TABLE `accesslog` ( `id` int NOT NULL auto_increment, `user_id` varchar(16), `created` datetime, `ip` varchar(64), FOREIGN KEY(`user_id`) REFERENCES `user`(`id`) ); ユーザーも全ての期間のデータも1つのテーブルで管理するのが普通だとは思うのですが、 アクセスログだけは利用するユーザー数にもよりますがやはり膨大になりますよね? そうすると1つのテーブルだと無理があると思うのです。 あるいは単にテキストファイルとして保存する方法もあるのかな?と思うのですが、 やはりなにかとSQLで操作したいのでMySQLなどのテーブルの設計が知りたいです。

  • MySQL テーブルの結合

    顧客ごとにテーブルを作る香ばしいプログラムのSQL文を書くことになりました。 user_0001 user_0002 user_0003 user_0004 user_0005 といった具合にどんどん増えていきます。 カラムは仮に id, name, tel が入っているとします。 プログラムの修正は行えません。 通常JOIN句でテーブルの結合を行うと思うのですが、「user_」という文字列を含んでいるテーブルを全て結合せよ!みたいな命令文はSQLで書けるのでしょうか? 無理、無駄、素直にプログラムで出せ、というアドバイスでも構いませんのでよろしくお願いします。

    • ベストアンサー
    • MySQL