- ベストアンサー
unionでマージした副問合せを結合
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
結合したテーブル間でカラム名が重複しているかと思いますので、提示のSQLの場合のテーブルの定義を書かないとなんともだと思います。 あと、「select as.xx1,asxx2 」これの「asxx2 」はタイポですよね?
その他の回答 (1)
- hogya
- ベストアンサー率67% (49/73)
副問合せにunionを使っている事自体に問題はないですね。 「こんな感じ」ではなくて、実際にxx1とxx2しかないシンプルなテーブルを3つ用意して試してみましたか?
お礼
ご指摘の通りシンプル版をつくっみたら出来ました。チェックしたつもりがカラムの重複が1か所ありました。 基礎的な事を忘れていました。ご指摘ありがとうございました
関連するQ&A
- 副問い合わせについて
お世話になります。明日から仕事で使うのですが、下記の構文が よく理解できません。宜しくお願い致します。 SQL Severは経験ありません。 経験はInfomixSql,Access,MySql程度です。 (1)行副問い合わせ(副問い合わせの結果が1行n列で返ってくる) SELECT * FROM t1 WHERE (c4, c2) = (SELECT MAX(c1), 'a' FROM t2); このwhere節の結合条件はどのような感じになるのでしょうか? (2)表副問い合わせ(副問い合わせの結果がm行n列(表)で返ってくる) SELECT * FROM t1 WHERE c4 IN ( SELECT c1 FROM t2 WHERE c4 >= 10 ) ORDER BY c1; 、 SELECT x1.c1, x2.y4 FROM t1 x1, ( SELECT c3, SUM(c4) AS y4 FROM t2 GROUP BY c3) AS x2 WHERE x1.c3 = x2.y4 ORDER BY c1; (1)に同じです。 参考になりそうなサイトでも結構ですので 宜しくお願い致します。
- 締切済み
- SQL Server
- 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` という風に書いてみました、結果としてはよさそうですが 方法としては間違ってないでしょうか? 他にいい方法があればアドバイスをお願いします。
- 締切済み
- MySQL
- 副問合せを使わずにUNIONと同様の処理ができるように書き換えする方法
http://okwave.jp/qa4191021.html こちらで質問させていただきましたが、新しく解決できない問題ができたので、再度別の質問を立てさせていただきます。 現在、以下のUNIONを入れ子になったSELECT文があります。 ----------------------------------------------------- SELECT sum( p ) , count( * ) +1 AS jyuni FROM ( SELECT ad_kahi AS kahi, ad_mid AS mid, ad_r AS r, ad_p AS p FROM ad_log UNION ALL SELECT g_kahi AS kahi, g_mid AS mid, g_r AS r, g_p AS p FROM game_log UNION ALL SELECT b_kahi AS kahi, b_mid AS mid, b_r AS r, b_p AS p FROM bazz_log ) WHERE kahi = '0' GROUP BY mid HAVING sum( p ) > 0 ------------------------------------------------ しかし、MySQLのバージョンの問題(MySQL 4.0.26)で、サブクエリを使うことができません。 そこで、同じ処理を副問合せを使わない形でできるようにする方法をご存知の方、いらっしゃいましたらご教示頂ければ幸いでございます。 ちなみに、一時テーブルを作る方法は考えました。 しかし、このスクリプトはWEBアプリの一部で実行・更新頻度が多く、多いときは1回につき数万行を処理することになるという事情がありまして、できるだけ軽く処理ができる方法が他にあればと考えております。 何卒よろしくお願い申し上げます。
- ベストアンサー
- MySQL
- 3テーブル外部結合方法について
3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・
- 締切済み
- その他(データベース)
- 同じテーブルでの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と表示されてしまいます。 宜しくお願いいたします。
- ベストアンサー
- SQL Server
- 異なる二つのテーブルの結合について・・・
お世話になっております。 ちょっとややこしい質問になります。 「1」 Aと言うテーブルのAAと言うカラムから、$AAAと言うレコードを抽出致しました。ここまでは出来ました。(ここでの抽出結果を$CCCと致します。) 「2」 「1」の抽出結果($CCC)を元に、Bと言うテーブルのBBと言うカラムから、BBBと言うレコードも抽出し結合したいと考えております。 一番の問題は、「1」で出た結果(CCC)を元に、抽出する事が出来ません。 「1」のソースのみ完成してます。 $rs=$DB->query("SELECT * FROM `A` WHERE AA = '$AAA' ↑の抽出結果=$CCCを元に↓ $rs=$DB->query("SELECT * FROM `B` WHERE BB = '$CCC' 結合させたいんです!! セクションしているので結合できないとバラバラになってしまいます。。。。 ご教示お願い致します! inner join を使うのは分かるのですが・・・進めません。(泣)
- ベストアンサー
- MySQL
- 3つのテーブルを結合した場合のWHERE
MySQLで3つのテーブルを結合した場合のWHEREがよくわかりません。 まず、下のような2つのテーブルがあるとします。 【テーブルaa】 ID | Name -------------- 1 | x 2 | y 3 | z 【テーブルbb】 ID | hizuke | category --------------------- 1 | stamp1 | a 1 | stamp2 | b 1 | stamp3 | c 2 | stamp1 | a 2 | stamp2 | d 3 | stamp1 | c この2つのテーブルを結合して、同じIDでhizukeが最大値のデータを抽出するクエリは、 http://okwave.jp/qa/q6918385.htmlを参考にして、 SELECT aa.Name, bb.category FROM bb INNER JOIN aa ON aa.ID = bb.ID where (bb.ID, bb.hizuke) in (SELECT bb.ID, max(bb.hizuke) FROM bb group by bb.ID ) ; でできました。 しかし、もう1つテーブルを結合すると期待した結果が得られなくなってしまいました。 【テーブルcc】 category | choice --------------------- a | ss b | tt c | uu というテーブルがあって、上のクエリで得られた bb.categoryと cc.categoryをリンクして、choiceを取得しようとしたのですがうまくいきません。 SELECT aa.Name, bb.hizuke, bb.category, cc.choice FROM bb INNER JOIN cc ON bb. category = cc. category INNER JOIN aa ON aa.ID = bb.ID where (bb.ID, bb.category, bb.hizuke) in (SELECT bb.ID, bb.category, max(bb.hizuke) FROM bb group by bb.ID ); というクエリでは、ダメなようです。 INNER JOINを入れ子にしたり、いろいろと試したのですがどうにもうまくいきません。 どうも私の力では解決困難なようです。どなたかヘルプを。
- 締切済み
- その他(インターネット・Webサービス)
- テーブル結合について、下記SQLをANSI結合の書き方で表したい。
テーブル結合について、下記SQLをANSI結合の書き方で表したい。 select * from (select key from A union select key from B union select key from C) X, A,B,C where X.key=A.key(+) and X.key=B.key(+) and X.key=C.key(+) このSQLをANSI結合の記述で書きたいのですが、 (+)での結合文になれておらず試行錯誤しております。 下記のようなのかなとは模索しておりますが、 手元に実行環境がなくわかりません。 また、要所気付く点などありましたら、ご指摘願います。 select A.*, B.*, C.* from (select key from A union select key from B union select key from C) X, LEFT JOIN A ON X.key=A.key LEFT JOIN B ON X.key=B.key LEFT JOIN C ON X.key=C.key
- ベストアンサー
- Oracle
- 副問合せ
問題:NATION表とINVENTION表より人口密度(人口/面積)が100以下の国で、発明事項がある国の国コードを表示する。 方法1:主問合せでNATION表を利用する 方がうまくいきません。 私の考えた下記SQL文では実行結果が80件返ってしまいます。 答えは方法2と同じ5件ですがどこが悪いのでしょうか? 回答のほどよろしくお願い致します。 方法1:主問合せでNATION表を利用する SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION) 方法2:主問合せでINVENTION表を利用する SELECT DISTINCT NATION_CODE FROM INVENTION WHERE NATION_CODE = ANY(SELECT CODE FROM NATION WHERE 100 >= POPULATION / AREA) NATION_CODE ----------- 107 136 142 154 157
- ベストアンサー
- Oracle
補足
早速ありがとうございます。ご指摘の通りタイポです。asにxx1カラムは1つで、afテーブルも同じなのですが重複しているとは、もう少し詳しく教えて頂いていいですか?この副問合せにunionを使っている事じたいに問題はないんでしょうか?