• ベストアンサー

2つの検索結果を繋げたい

毎度お世話になります。 2つの異なるテーブルから 同じような結果をselectするのですが 可能ならば一発のSQL文で結果を得たいと考えております。 以下のように繋がった結果を得ることは可能でしょうか? ご教示いただければ幸いです。 宜しくお願いいたします。 A表へのselect結果1 あ | い ------------- (1) | (1) (1) | (1) B表へのselect結果2 あ | い ------------- (2) | (2) (2) | (2) 本来ほしい結果 あ | い ------------- (1) | (1) (1) | (1) (2) | (2) (2) | (2) ※単純に繋がった結果を得られれば満足です。

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

  • ベストアンサー
  • SUPER-NEO
  • ベストアンサー率38% (706/1857)
回答No.2

結論から言えば可能です。 MySQL のドキュメントから、 「UNION ALL」の使い方を調べてみてください。 やりたいことは実現できるかと思います。 但し、私見として述べさせていただきますと、 2つ以上の結果をマージした形で結果を得る場合、 実際はサーバは、その回数だけ問い合わせを実行しています。 つまり、クライアントからサーバへのラウンドトリップは 1回だけですが、サーバ内部では複数の問い合わせが実行されています。 データ件数が膨大である場合は、テーブルの分散は効果的ですが、 少量データである場合の分散は逆効果である場合がありますので、 ご注意ください。

nono_taro
質問者

お礼

アドバイスありがとうございました。 やっと、やりたいことが実現できました! この度はお忙しい中、誠にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • SUPER-NEO
  • ベストアンサー率38% (706/1857)
回答No.3

#2です。 ちょっと勘違いしてました。 UNION ALL は、共通的に使える書き方ですから、 MySQL と書いてしまいましたが、Oracle でも十分に使えます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

union allで二つのselect文をくっ付けましょう。

nono_taro
質問者

お礼

アドバイス、ありがとうございました。 こんなに簡単にできるとは思っていませんでした。 お恥ずかしい限りです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PL/SQLで…SQLの実行結果を変数を格納する方法

    毎度お世話になります。 SQL文の実行結果を変数に格納する方法がわからず困っております。 ご存知の方が居られましたらご教示いただきたい所存です。 常に1つの値しか返さないようなSQL文なので 変数V number := 'select count(B列) from B表'; みたいな書き方はで 入るか見てみようと思ったのですが コンパイルはできるものの、 実行すると「文字から数値への変換エラー。が発生しました」と なって上手くいきませんでした。 'select count(B列) from B表'が単なる文字列として解釈されて エラーになっているのだとは思うものの 正しい書き方がわからないのでよろしくお願いいたします。

  • SQLでlike検索条件を副問い合わせ結果にしたい

    SQLでlike検索する際、検索キーワードを副問い合わせの結果文字列とする方法があればご教示下さい。 イメージでは、、、 select A1列 from A表 where A1列 like '(select B列 from B表 where 条件)'; みたいなのが可能であればいいのですが。。。( 宜しくお願いします。

  • SQLの結果でWindowsコマンドを実行

    毎度お世話になります。 SQL文の実行結果をもとにWindowsコマンドを実行したいのですが方法がわからず困っております。 ご存知の方がおられましたらご教示いただれば幸いです。 まず実行するSQLは select foldername列 from A表; foldernameは、複数行の結果が返ってきます。 この帰ってきた結果を元に、Winddowsのフォルダー(ディレクトリ)を削除するコマンド > rmdir c:\abc\foldername を発行して、c:\abcフォルダー配下にあるfoldernameと同じ名前のフォルダーを削除 することを考えています。foldernameは複数ありますので、ループ処理も必要です。 基本的な質問で恐縮ですが、何卒よろしくお願いします。

  • 複数テーブルでの件数検索について

    Oracle上の2つのテーブルからの条件でマッチする件数をSQLで作成しています。 内容としては、テーブルAの区分=1 かつ テーブルBの種別がスペースの件数です。 テーブルAの該当するデータは10件中3件、テーブルBの該当するデータは50件中15件で、本来両方がマッチするのは2件です。 SELECT COUNT(*) FROM テーブルA,テーブルB WHERE テーブルA.区分 = '1' AND テーブルB.種別 = ' ' ; 上記のSQL文で件数をカウントしたのですが、どうも結果では30件とカウントされてしまいます。 なんとか2件として結果を出したく、参考資料を調べているところなのですが、今のところ参考になる文献が見つからず悩んでます。もし簡単にカウントできるSQLがあったり、分かる方がいれば手助けして頂きたいと思い、今回投稿しますのでご教授賜りたく思います。よろしくお願いします。

  • SQL内でループさせるような検索文

    以下の(1)のようなデータがあった場合、一つのSQL文で(3)の表が 取得できる方法はございますでしょうか? (1)table T_SAMPLE | UID | FLAG | CREATE_DATE | ------------------------------------------------ | 000 | A | 2009-01-26 00:00:00 |★ | 000 | A | 2009-01-26 00:00:10 | | 000 | B | 2009-01-26 00:00:20 | | 002 | A | 2009-01-26 00:00:05 |★ | 002 | B | 2009-01-26 00:00:13 | | 002 | A | 2009-01-26 00:01:00 | | 002 | B | 2009-01-26 00:02:02 | | 003 | B | 2009-01-26 00:05:00 |★ | 004 | B | 2009-01-26 00:00:00 |★ | 004 | B | 2009-01-26 00:00:15 | | 004 | A | 2009-01-26 01:00:00 | | 005 | B | 2009-01-26 00:00:11 |★ | 005 | B | 2009-01-26 00:04:05 | (2)同じUIDがあった場合、CREATE_DATEが早い情報(上表★)を使用 | UID | FLAG | CREATE_DATE | --------------------------------------------------- | 000 | A | 2009-01-26 00:00:00 |★ | 002 | A | 2009-01-26 00:00:05 |★ | 003 | B | 2009-01-26 00:05:00 |★ | 004 | B | 2009-01-26 00:00:00 |★ | 005 | B | 2009-01-26 00:00:11 |★ (3)FLAGでカウント <= 取得したい結果 | COUNT(FLAG) | FLAG | -------------------------------- | 2 | A | | 3 | B | イメージとしては、 [処理a] select FLAG from T_SAMPLE where UID = '000' order by CREATE_DATE limit 0,1 ×それぞれUID とすると、上記(1)→(2)で select UID,[処理aの結果においてUIDに対応したFLAG] from T_SAMPLE group by UID という状態の結果が一度のSQLで取得できればよいと考えているのですが。 実際にこの処理を実施する際は、自由に指定されるCREATE_DATEの範囲で絞り込むため、別テーブルを作って、、、等の処理は避けたいのです。 最適な方法がございましたら、なにとぞご教示願います。

    • ベストアンサー
    • MySQL
  • 検索結果件数を取りたいです。

    環境は、php + mysqlで作ってます。 DBのテーブルに格納されている文字列をセレクト文で取り出して 対象件数が何個あるか知りたいです。 DBのテーブルに格納されている文字列はURLの文字列が入ってます。 例えば http://www.yahoo.com/ 確認のため、予め $obj = "http://www.yahoo.com/"; として、DBに入っているデータを書いておいて以下を実行しました。 $sql="select * from geturl where url=".$obj; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); echo $num; 結果: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/~~ といったエラーが出てしまいました。。。 今度は、予め数字を入れておいて実行してみました。 入れた文字は「123」です。 $obj = "123"; $sql="select * from geturl where url=".$obj; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); echo $num; 結果:正しく対象件数がブラウザに表示されてました。 数字だと正しく処理されて、英文字だとエラーになる原因がわかりません。。 アドバイスいただければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • SQL: select  結果のカラム結合

    selectの結果(文字列)を結合ってできますか。 例えば以下のテーブルがあって、カラムAとBを結合した結果が欲しいのです。Aカラム-Bカラム という結果が欲しいのです。 (つなぎ文字はわかりやすければなんでも可) なんとかスマートに一つのSQLでできないでしょうか。 A | B | C ---+-----+--- 1 | aaa | testtest 2 | bbb | hogehoge SQL > select .... 期待する答え ans | C ---+-----+--- 1 -aaa | testtest 2-bbb | hogehoge

  • SQLでの計算結果がおかしい

    SQLで調和平均(もどき)を計算したいのですが、下のようなSQL文で計算した結果が正しく出ないのです。 select ID, 3 / ((1 / (A1 + 1) + 1 / (B1 + 1)) + 1 / (C1 + 1)) as HARMEAN from TABLE (各項に1を足しているのは、ゼロ除算を避けるための苦肉の策です) たとえば、A1=20, B1=10, C1=50 の場合、上記の結果が27.14と出ます。 (正しい計算結果は18.97のはずです) ちなみに、上とまったく同じ式をExcelに入れて計算させると、ちゃんと正しい結果が出ます。 何が原因なのでしょうか?

  • 意味は同じはずなのに結果が違います。

    SELECT * FROM テーブルA LEFT OUTER JOIN ( SELECT * FROM テーブルB WHERE テーブルB.列X IS NOT NULL) as テーブルB ON テーブルA.列A = テーブルB.列A SELECT * FROM テーブルA LEFT OUTER JOIN テーブルB ON テーブルA.列A = テーブルB.列A WHERE テーブルB.列X IS NOT NULL 上のSQLも下の同じ事をしてると思うのですが 上では検索結果が10件出た場合 下では0件になってしまいます。 SQL自体シンプルで間違っていないと思うのですがなぜでしょうか?

  • 計算結果をCASE WHENで判断したとき、ELSEで計算結果をそのまま持ってくるSQL文法は?

    SQL SERVER2005を使用しています。 テーブルAがあり、Aが持つフィールド「suuchi」には数値が入っているとします。 suuchiフィールドの値を計算して、その結果が0以上なら計算結果を。負の数なら0を出力するSQL文を書きたいのです。 CASE WHEN を使用して以下のSQLを書きました。 SELECT CASE WHEN ( suuchi*2 + 1 ) < 0 THEN 0 END FROM テーブルA; しかし、結果は計算結果が負の数の場合は「0」になりますが、0以上の場合が表示されませんでした。 理由は、CASE WHEN でELSEを省略した場合、結果がNULLになるためと思われます。 以下のSQLでは期待とおりの結果が得られます。 SELECT CASE WHEN ( suuchi*2 + 1 ) < 0 THEN 0 ELSE ( suuchi*2 + 1 ) END FROM テーブル; しかし、同じ計算式を2回書くのは今一正しくないように思えます。 CASE WHEN で計算結果を判断した場合、ELSEでは計算済みの結果を取ることはできないのでしょうか? 上は例として書いたので簡単な計算式ですが、実際私が業務で使用している計算式はかなり長いため できれば式を2回書くことを避けたいのです(SQL文が長くなるため)。 計算結果に一時的に別名をつけようとして、以下のようなSQL文を書いたのですが「AS 付近にエラーがあります」といわれます。 SELECT CASE WHEN ( suuchi*2 + 1 ) AS TMPFIELD < 0 THEN 0 ELSE TMPFIELD END FROM テーブル; 質問は2点です。 1) 計算式の結果をCASE WHEN で判断した場合、ELSEの時は計算結果を取得したい場合は、再度同じ計算式を書く必要がありますか? 2) 上の答えが「必要ない」場合、上記条件を満たすSQLの書き方をご教示いただけませんでしょうか? なお、質問文の文章、SQLServerの環境の記述不足、SQL文等で意味不明な箇所がありましたらご指摘ください。 以上です。よろしくお願いします。