• 締切済み

2つ以上のテーブルの結合

こんにちは。 数年ぶりにプログラムを組むことになりSQLを考えているのですが、たとえば添付画像のように2つのテーブルを1つにまとめた結果を求めるにはどうしたらいいのでしょうか? 空白部はゼロでも空白でも構いません。 実際にはもっと条件や項目が多いのですが、それ以前にこれができず。。。 ご教授お願いいたします。 テーブルA    項目 日付 数1 ---------------- 001 0216 100 001 0217 50 003 0215 60 テーブルB 項目 日付 数2 ---------------- 001 0217 40 002 0216 200 ↓ 項目 日付 数1 数2 ---------------------- 001 0216 100 001 0217 50 40 002 0216 200 003 0215 60

みんなの回答

  • ngwave
  • ベストアンサー率27% (23/84)
回答No.3

1です。 full outer 使えるSQLなら、full outerでOK でも、結構使えないのがあるので、その場合は、 left で軸変えて両側から取るか、 left と right使うかして、 unionして下さい。 いい図があったので、リンク貼っておきます。 http://i.stack.imgur.com/udQpD.jpg

silk_001
質問者

お礼

ngwaveさん、図のほうありがとうございます。 実際には4つ以上のテーブルを集計しながら結合するのでどうするのがよいのか判りませんが、left join + union と full outer いろいろ組み合わせて試してみようと思います。 ありがとうございました。

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

FULL OUTER JOIN を使います。 SELECT COALESCE(a.項目, b.項目), COALESCE(a.日付, b.日付), a.数1, b.数2 FROM テーブルA AS a FULL OUTER JOIN テーブルB AS b ON b.項目 = a.項目 AND b.日付 = a.日付

silk_001
質問者

お礼

FULL OUTER JOINってのがあるんですね、知りませんでした。 COALESCEも知りませんでした。調べてみます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • ngwave
  • ベストアンサー率27% (23/84)
回答No.1

どっちかのTBLのレコードを基準にするのではなく、 どちらかにあれば、つまり、すべてのレコードを拾うパターンのヤツですよね。 それは一手間いります。 まず、どちらかのテーブルを軸に(left join)して、全件求めます。 次に、逆側のテーブルを軸に(left join)して、where句で、joinテーブルのキーがnullのものを求めます。 その2つを統合(union)します。 Aのデータと、BからAを除いたデータをガッチャンコです。

silk_001
質問者

お礼

早速のご回答ありがとうございます。 やはり手間かかりますよね。。。 お教えいただいた内容で試してみます。 ありがとうございました。

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

関連するQ&A

  • 3つ以上のテーブルの結合に関して

    いろいろな書籍を見ながら試してみましたが どうも求めている結果が得られませんでした… ヒントでも構いませんのでアドバイスお願いします。 テーブルの仕様 ■テーブル1■ 店舗コード 日付 フィールド1n フィールド2n フィールド3n フィールド4n ■テーブル2■ 店舗コード 日付 フィールド5 ■テーブル3■ 店舗コード 日付 フィールド6 2つのテーブルの内部結合や外部結合のSQL文は確認できましたが 3つ以上の記述がテキストにありませんでした。 ※もしかしたら2つのテーブルを結合してからかと思いましたが 具体的な方法が思い浮かびませんでした。 オラクルは9g SQL*PLUS ■その他の条件■ すべてのフィールドが例えNULLでも店舗コードと日付 は表示されるようにする。 INを使用して抽出したい店舗コードのみを表示させたい。 (その場合並び替え順を指定したい場合はINのあとで順番を指定すれば よろしいでしょうか?) フィールド1~4までの「n」は同じ種類のフィールドですが区分が10ずつ あり算術演算子で合計を求めた値のみを表示させます。 そのためASを使用してフィールド名を短くしたいと考えています。 店舗コードと日付は3つのテーブルに共通してありますが 結合した場合は1つづつの表示にしたいです。 大変申し訳ございませんが 宜しくお願いします。

  • テーブル結合

    度々お世話になっています。 Mysqlのテーブル結合したいと思ってます。 テーブル構成は以下のとおりですのでご参照ください。 ■テーブルA id | name 1 | bind 2 | samba 3 | apache ■テーブルB id | detail 3 | test 3 | test 1 | test ■結合結果 id | count 1 | 1 2 | 0 3 | 2 テーブルA,Bはidコラムで紐づいています。 この際、テーブルBのidごとにレコード数を出力したいのですが、 どういったSQLを流せば良いでしょうか。 ご教示願います。

    • ベストアンサー
    • MySQL
  • 2つのテーブルからのレコード取得

    はじめまして。 現在、画面上で検索条件を選択し、検索ボタンを押すと結果を返すアプリケーションを作成しておりますが、 画面上の検索の条件に「空白」を加えると、検索前に空白で表示されていた件数に比べて少ない結果になる、という現象が起こっています。 原因は、テーブルAとテーブルBを外部結合させてデータを取得して表示していますが、 検索前はBにレコードを持たないデータも表示しており、対象項目に検索条件「空白」を設定すると、テーブルBにレコードを持ち、 かつ該当項目が空白(null)であるデータのみ検索して、テーブルBにレコードがないデータは検索されないため、検索前より件数が少なく表示されるためだと判明しました。 画面上空白が選択されたら、テーブルAの該当項目は空白、テーブルBにはデータを持たないレコードも表示したいのですが、 どのようにすればよいかご教示いただければ有難いです。 (検索条件は複数あり、空白を指定できる項目も複数あるという前提です。) 以上、よろしくお願い致します。

  • 【至急】SQLの結合について教えてください(2)

    select * from A select ef from B where ef = '3' かつ、A.ab = B.ab and A.cd = B.cd 至急質問させてください。 上記SQLを結合したいです。 取得したいデータはAのテーブルの全項目で、 取得条件として、Aのテーブルのキー項目 = Bのテーブルのキー項目に、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。 ※キー項目の値は条件に指定できない(持っていない)ことがわかりました。 先ほどの質問にご回答下さった皆様、申し訳ございません。

  • テーブルの項目が異なるテーブルの結合方法

    こんばんは。 すみませんが、下記のように出力するSQLを教えて下さい。 [処理table]のstatusが「新規」のに該当する場合、[処理table]の内容を、 [処理table]のstatusが「新規」のに該当しない場合、[処理ログテーブル] の「日付」が現在日付に近い内容のみを出力する。  氏名 project名 status 日付 ------+----------+-------+-------  鈴木 softA  新規  大塚 softB  承認   08/20  大沢 softC  新規 を期待しています。 SQLの経験が少ない為、悩んでます。 「UNION ALL 」について調べて見ましたが、カラム数が異なるのでNGと判断 しました。 「それぞれの条件の結果を縦につなげて…」とイメージしてみたのですが、 それに相当する資料が見当たらず、悩んでいます。 tableの[処理ログtable]の「日付」を[処理table]の項目とすればよ いのですが、現在のDB設計がこのようになってしまっているので、改善できま せん。 補足もしますので、お忙しいところすみませんが、宜しくお願いします。 -説明- [顧客table](主キー:顧客ID) 顧客ID 氏名 ------+------- 020001 鈴木 020002 大塚 020003 大沢 [処理table](主キー:通番(自動発番)) 通番 顧客ID projectID status ----+-------+----------+----------- 0001 020001   0001 新規 0002 020003   0003 新規 0014 020002   0004 承認 [処理ログtable](主キー:通番(自動発番)) 通番 顧客ID projectID status 日付 ----+-------+----------+-------+------ 0032 020002   0004 修正  08/02 0033 020002   0004 修正  08/15 0034 020002   0004 承認  08/20 [projecttable](主キー:projectID) projectID project名 ---------+----------------   0001 softA   0002 softB   0003 softC   0004 softF

  • テーブルのマージSQLに関して

    初歩的なSQLの質問で申し訳ありません。 以前にも同じような内容で投稿させて頂きましたが、教えて下さい。 下記のような、ある異なる名前の同項目を持つ2つのテーブルが存在します。 《テーブル》 Aテーブル   社員番号、日付、内容、所属、時間、結果 Bテーブル  社員番号、日付、内容、理由  ※ 内容に関しては、AテーブルとBテーブルで全く違います。 これらの2つのテーブルをマージさせ、社員番号毎の内容毎、日付順に したいと考えています。 以前に以下のようなUNIONを教えてもらいましたが、所属、時間、結果、理由という 項目全てを出力するとした場合、どのように記載すれば良いでしょうか? UNIONの場合、項目が異なるとエラーとなってしまうかと、、、 《UNIONのSQL》 SELECT * FROM ( SELECT 社員番号, 日付, 内容 FROM Aテーブル UNION SELECT 社員番号, 日付, 内容 FROM Bテーブル ) ORDER BY 日付, 社員番号, 内容 教えて下さい。 よろしくお願いします。

  • 【至急】SQLの結合について教えてください。

    select * from A where ab = '1' and cd = '2' select ef from B where ab = '1' and cd = '2' and ef = '3' 至急質問させてください。 上記SQLを結合したいです。(Oracleです) 取得したいデータはAのテーブルの全項目で、 取得条件として、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 キー項目は両テーブルとも同じ(ab, cd)です。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。

  • 2つのテーブル結合

    Oracle10g使用しています。 テーブルAとテーブルBを結合させてデータを取得したいと思っています。 [テーブルA] ID name 1 A 2 B 3 C 4 D [テーブルB] ID SEQ VALUE 1 1 111 2 1 222 2 2 333 3 1 444 4 1 555 4 2 666 4 3 777 テーブルAのキーは[ID]、テーブルBのキーは[ID,SEQ]です。 この二つを連結して以下のように出力したいと思っています。 ID SEQ NAME VALUE 1 1 A 111 2 2 B 333 3 1 C 444 4 3 D 777 テーブルBのデータは同じIDのうち最大のSEQのものを取得したいのですが よいSQLが思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。

  • 数種類のテーブルを結合させて呼び出し

    こんにちは。 サークルメンバーのマラソンのタイムを管理するデータベースを作っています。 現在作っているテーブルは、 memberinfo(会員番号(number)、名前(name)) full(会員番号(number)、日付(date)、タイム(time)) 10km(会員番号(number)、日付(date)、タイム(time)) です。 これら3つのテーブルからメンバー全員のすべての距離の記録を抽出するsql文を作っています。 例えば、会員番号1のAさんが2005年にフルマラソンの記録が2:55:47で2004年に10キロの記録が34:53、会員番号2のBさんが2003年にハーフマラソンの記録が1:20:12で2003年に10キロの記録が40:21だとすると 結果が 1 A 2005 full 2:55:47 1 A 2004 10km 34:53 2 B 2003 half 1:20:12 2 B 2003 10km 40:21 という結果が出力されるというものです。 sql文は以下のとおりです。 $sql = "select memberinfo.number, name, date, time from memberinfo, full, half, 10km where (memberinfo.number = full.number = half.number = 10km.number)"; これだとsql文が間違っているようです。 どうすればよいでしょうか? よろしくお願いします

  • ACCESS テーブルの結合

    お世話になります。 テーブルA(約20万レコード)、B(6レコード)があり、共通しているフィールドは以下の通りです。  ・受注日  ・製品コード  ・数量 AとBのテーブルの共通しているフィールドを条件無しで1つのテーブルとして見立てたいと思っておりますがうまくいきません。 SELECT A.製品コード, A.数量, A.受注日 FROM A UNION SELECT B.製品コード, B.数量, B.受注日 FROM B; 上記SQLでエラーにはならないのですが、レコード数が本来約20万レコードあるはずが、7万レコードしか抽出されません。 SELECT A.製品コード, A.数量, A.受注日 FROM A; と SELECT B.製品コード, B.数量, B.受注日 FROM B; をそれぞれ分けてやると、レコード数に問題ありません。。 どのようにすれば2つのテーブルを1つに結合できるのでしょうか。 ご教授の程、宜しくお願い致します。