• ベストアンサー

テーブルの差分をとる結合

TableAとTableBがあります。構造は同じです。 中身は下記のようだとします。 TableA      TableB ID VALUE     ID VALUE 1 A       3 C 2 B       4 D 3 C        差分結合結果を下記のようにとりたいのです。 1 A 2 B 4 D 良い方法をご存じでしたら、ご教授よろしくお願い致します。

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

SQL Server 2005 以降であれば、EXCEPT が使えるので、TableA - TableB と TableB - TableA の結果を UNION してやれば良いかと。 http://codezine.jp/article/detail/1304?p=2 例) -------------------------------------------------------------- (SELECT * FROM TableA EXCEPT SELECT * FROM TableB) UNION ALL (SELECT * FROM TableB EXCEPT SELECT * FROM TableA); ------------------------------------------------------------------ EXCEPT が使えないバージョンの場合は、 NOT EXISTS を使って差分を抽出してやれば良いでしょう。 例) -------------------------------------------------------------- SELECT * FROM TableA WHERE NOT EXISTS ( SELECT 'X' FROM TableB WHERE TableA.ID = TableB.ID AND TableA.VALUE = TableB.VALUE ) UNION ALL SELECT * FROM TableB WHERE NOT EXISTS ( SELECT 'X' FROM TableA WHERE TableA.ID = TableB.ID AND TableA.VALUE = TableB.VALUE ) ------------------------------------------------------------------

goouser20
質問者

お礼

お礼が遅くなってしまい申し訳ありません。 本当にありがとうございました。

その他の回答 (2)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

結合がお好みならば、FULL OUTER JOINを使ってみてください。 SELECT ISNULL(a.ID,b.ID) ID, ISNULL(a.VALUE,b.VALUE) VALUE FROM TableA a FULL OUTER JOIN TableB b ON b.ID=a.ID WHERE a.ID IS NULL OR b.ID IS NULL

goouser20
質問者

お礼

お礼が遅くなってしまい申し訳ありません。 本当にありがとうございました。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

OSQLだと面倒なので、ACCESSをフロントエンドで使用するとして。 1)TableAとTableBの不一致クエリを作成(TableAにあってTableBに無いもの) 2)TableBとTableAの不一致クエリを作成(TableBにあってTableAに無いもの) 3)1)と2)のユニオンクエリを作成 ※1)2)は副問い合わせで不一致でも、結合してis nullでも良い または 1)TableAとTableBのユニオンクエリを作成(UNION ALLでなくてよい) 2)TableAとTableBの完全一致クエリを作成 3)1)と2)の不一致クエリを作成

goouser20
質問者

お礼

お礼が遅くなってしまい申し訳ありません。 本当にありがとうございました。

関連するQ&A

  • 2つのテーブルを結合する際にIDを割り当てたい

    PHPでmySQLを作成しています。 現在学習中なのですが、自己解決できない問題が発生したのでどうかお知恵をお貸しください。 --- 同じデータベースにTableAとTableBがあります。 中身は下記のようだとします。 TableA      |  TableB id  name time | name time :   :   :  |  C1   D2 101 A1  B1  |  C2   D2    102 A2  B2  |   :    : 103 A3  B3  |  C20  C20 --- テーブルAのカラムid、name、timeの3カラム、テーブルBはname、timeの2カラムです。 これを --- TableA        TableB id  name time  name time :   :   : 101 A1  B1 102 A2  B2 103 A3  B3 104 C1  D1 105 C2  D2 :   :   : 123 C20  D20 --- とするような方法を教えてください。(TableBはレコードなし) テーブルの結合ではIDが割り当てられず、上手な方法が思いつきません。 どうかご教示のほど、よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • SQLでテーブルを結合した結果を取り出し

    SQLで以下の様なテーブルがあります。 tableA、tableB、tableCを使って、IDとNUMとRANKを結合し、 ID毎に、 RANKが1つでもあったら、”○”でその数を RANKが1つもなかったら、”×”で0を 取り出したい。 「oracle10g」です。 -- tableA ID,NUM,NAME,・・・・・ 000001,001, 000001,002, 000001,003, 000002,001, 000003,001, 000003,002, -- tableB ID,NUM,RANK 000001,001,A 000001,001,B 000001,001,C 000001,002,A 000001,003,C 000002,001,B 000002,002,B 000003,001,A 000003,002,A 000003,002,C --tableC RANK,NAME A, B, C, 結果として、 ID,RANK,判定,個数 000001,A,○,2 000001,B,○,1 000001,C,○,2 000002,A,×,0 000002,B,○,2 000003,A,○,2 000003,B,×,0 000003,C,○,1 を得たいです。 どのようなSQLにしたらよいか、よろしくお願いします。

  • SQL:テーブル結合で該当レコードがない場合

    SELECT TableA.ID,SUM(TableA.量),TableB.金額 FROM TableA,TableB WHERE TableA.ID = TableB.ID GROUP BY TableA.ID,TableA.量,TableB.金額 こんな感じのSQLなんですが TableAをメインテーブルとして ↓のような結果を得るように作り変えれないか考えています ■TableBとの結合レコードあり(金額登録あり) 1,50,1500 ■TableBとの結合レコードあり(金額登録なし) 1,50,(NULLかスペース) 考えているんですが思いつかないのでヒントいただけたらと思います。宜しくお願いします。

  • テーブルの内容で更新したいのですが

    下記のようにテーブルがあります。 TableA colA colB ---- ----  A   1  B   2  C   3 TableB colA colB ---- ----  A   1  A   2  C   3 TableAに対してTableBとcolAが一致するcolBの合計を加算したいのです。 結果として TableA colA colB ---- ----  A   4  B   2  C   6 AはTableBに2レコードあるので合計3が加算されて4 BはTableBにレコードがないので変わらず2 CはTableBに1レコードあるので3が加算されて6 SQLでこのような更新処理(update)はできないでしょうか? よろしくお願い致します。

  • 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が思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。

  • 複数テーブル検索で同idの部分は結合させたい

    初心者です。 ちょっと伝えずらいのですが、 下記のようなテーブル構造になっています。 ■tableA +----+-------------------+------------------------------------------+ | id | title | body | +----+-------------------+------------------------------------------+ | 1 | test1 | aaaaaaaaaa | | 2 | test2 | bbbbbbbbbbbb | +----+-------------------+------------------------------------------+ ■tableB +----+-------------------+------------------------------------------+ | id | name | sex | +----+-------------------+------------------------------------------+ | 1 | taro | men | | 2 | yoko | women | +----+-------------------+------------------------------------------+ ■tableC +----+-------------------+------------------------------------------+ | id | num | order_id | +----+-------------------+------------------------------------------+ | 1 | 33 | 1 | | 2 | 66 | 2 | +----+-------------------+------------------------------------------+ ■tableD +-------------------+------------------------------------------+ | icons | order_id | .+-------------------+------------------------------------------+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 5 | 1 | | 1 | 2 | | 3 | 2 | +-------------------+------------------------------------------+ tableA,B,Cのidを軸にデータを表示したいのですが、 --------------------------------------------------------- tableA.id , body , name , sex , num , order_id FROM tableA , tableB , tableC WHERE tableA.id = tableB.id AND tableA.id = tableC.id ---------------------------------------------------------- で出力できました。 で、tableDのiconsの内容も出力したいのですが、 --------------------------------------------------------- tableA.id , body , name , sex , num , order_id , icons FROM tableA , tableB , tableC WHERE tableA.id = tableB.id AND tableA.id = tableC.id AND tableC.order_id = tableD.order_id ---------------------------------------------------------- でやると、2行しかデータがでないはずなのですが、 6行出力されてしまいます。 たぶん、tableDのデータの持ち方が、 ひとつのidに複数のiconsがある場合は、 行ごとにレコードを分けているためだと思いますが・・・ tableDの行分、6行でているのです。。 なので、期待する結果は、 ちゃんとidの数分だけ出力されて、 同order_idにiconsが複数ある場合は、 行ごとに分かれるのではなく、 ひとつのカラム?にカンマ区切りなどで 入れたいのですがどうしたらよいでしょうか?? ↓期待する結果 ----------------------------------------------------------------------- +----+-------------------+------------------------------------------+ | id | title | body | order_id | icons +----+-------------------+------------------------------------------+ | 1 | test1 | aaaaaaaaaa | 1 |1,2,3,5 | 2 | test2 | bbbbbbbbbbbb | 2 | 1,3 +----+-------------------+------------------------------------------+ ※カンマじゃなくてもいいです わかりづらくて申し訳ありませんが、 ご教授お願いいたします。 MySQL 5.0.90-log ちなみにec-cubeの高度な設定の csvを吐き出す部分で使用しています。

    • ベストアンサー
    • MySQL
  • 異なるテーブルの結合方法を教えてください

    下記のような同一フィールド名を持つ異なるテーブルがあります。 tableA key1 field1 0007 AAAAAA 0009 B----- tableB key1 field1 0001 AAAAAA 0002 B----- 0003 AAAAAA 0004 C----- 0005 D----- 0006 AAAAAA 0008 E----- この2つテーブルから field1='AAAAAA' となる列を取得して下記結果を得たいと考えています。 key1 field1 0007 AAAAAA 0006 AAAAAA 0003 AAAAAA 0001 AAAAAA お教え頂きたくお願いいたします。

    • ベストアンサー
    • MySQL
  • テーブルの結合について

    うまく動作しなくて、困っております。 MySQLを利用しており、その際のテーブルの結合で困っています。 table a +-+--+ |id|col| +-+--+ | 1|A| | 2|B| | 3|C| | 4|D| | 5|E| +-+--+ table b +-+--+ |id|col| +-+--+ | 2|G| | 5|G| | 6|G| +-+--+ 上記テーブルを結合し、下記のようにしたいのですが・・・。 +-+--+ |id|col| +-+--+ | 1|A| | 2|B| | 3|C| | 4|D| | 5|E| | 6|G| +-+--+ 参考書・Webから探してみましたが、 見つかりませんでした。 よろしくお願い致します。

  • 3つのテーブルを結ぶSQLの書き方

    お世話になります。 3つのテーブルを結びつけるSQLの書き方がわかりません。ご指導お願いします。 [TableA][ID] [TableB][ID] [TableC][ID] [TableA]と[TableB]をLEFT JOINでつなぐ。 上の結果を[TableA][ID]と[TableC][ID]でInner joinでつなぐ。 つまり・・・ SELECT TableA.ID,TableB.ID FROM TabelA LEFT JOIN TableB→この結果 SELECT TableA.ID,TableB.ID TableC.ID From この結果 INNER JOIN TableC ON TableA.ID = TableC.ID こんな感じのことをやりたいのですが、記述の方法がわかりません。 どなたかお知恵をお貸しください。

  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。