Accessで差分取得!LEFT JOINエラーを解決する方法とは?

このQ&Aのポイント
  • Accessで差分抽出する方法を教えてください。新旧テーブル間の関連がない場合にはどうすればいいのでしょうか?
  • 旧テーブルと新テーブルを比較して、差分を取得する方法を教えてください。
  • LEFT JOINを使用して差分抽出を行おうとしたが、エラーが発生してしまいます。解決策を教えてください。
回答を見る
  • ベストアンサー

Accessで差分取得する方法は? LEFT JOIN エラー

Accessで差分抽出するSQLを教えてください。 【旧テーブル】t1 id, class, number, value 1, "a", 1, "aka" 2, "a", 2, "aki" 3, "a", 3, "aku" 【新テーブル】t2 id, class, number, value 1, "a", 1, "aka" 2, "a", 2, "更新" 3, "a", 3, "aku" 4, "a", 4, "新規" 5, "b", 1, "新規" 【ダメだったクエリ】 SELECT t2.* FROM t2 INNER JOIN t1 WHERE t1.class IS NULL OR t1.number IS NULL 【望む結果】 4, "a", 4, "新規" 5, "b", 1, "新規" *列 id は各テーブルの主キーですが、新旧テーブル間の関連はありません(リレーションではありません)。

  • xespr
  • お礼率73% (61/83)

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

  • ベストアンサー
  • bonaron
  • ベストアンサー率64% (482/745)
回答No.3

また違ってましたね。 SELECT T2.* FROM T2 LEFT JOIN T1 ON T2.number = T1.number AND T2.class = T1.class WHERE T1.class Is Null OR T1.number Is Null

xespr
質問者

お礼

大正解です!ありがとうございます。

その他の回答 (2)

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

あ、もしかしたらこういうことだったのかな? SELECT T2.* FROM T2 WHERE T2.class Not In (Select Distinct Class From T1) OR T2.number Not In (Select Distinct Number From T1)

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.1

LEFT JOIN エラーと言っても、 【ダメだったクエリ】は INNER JOIN になっていますが。 SELECT T2.* FROM T2 LEFT JOIN T1 ON T2.id = T1.id WHERE T1.id Is Null これで、望む結果が得られます。

xespr
質問者

補足

>LEFT JOIN エラーと言っても、 >【ダメだったクエリ】は INNER JOIN 本当ですね(^^; 失礼しました。 id は一意にするためのキーで、新旧の関連性はないのです。 class と number が一致すれば、同一レコード(新レコードと旧レコード)となります。 idは言わば、各テーブル内の行番号です。 SQLでは無視していただいて良いです。 【新テーブル】t2 id, class, number, value 11, "a", 1, "aka" 52, "a", 2, "更新" 63, "a", 3, "aku" 84, "a", 4, "新規" 105, "b", 1, "新規"

関連するQ&A

  • 複数JOINしているとCOUNTが正しく取得できな

    LAMP環境で開発をしています。 SQL文でCOUNTを求める際に、まとめて結果を求めようとして上手く行きません。 状況としては以下です。 テーブルdはidをkeyにa,b,c3つのテーブルとjoinしています。 id = 1の場合、テーブルa,b,cにマッチするレコードがそれぞれに4個、1個、0個あります。 ひとつひとつを SELECT COUNT(CASE WHEN a.name IS null THEN 1 ELSE null END) as a_count FROM d INNER JOIN a ON a.id = d.id WHERE d.id = 1 として結果を求めると4,1,0と出るのですが、まとめて SELECT COUNT(CASE WHEN a.name IS null THEN 1 ELSE null END) as a_count, COUNT(CASE WHEN b.name IS null THEN 1 ELSE null END) as b_count, COUNT(CASE WHEN c.name IS null THEN 1 ELSE null END) as c_count FROM d INNER JOIN a ON a.id = d.id INNER JOIN b ON b.id = d.id INNER JOIN c ON c.id = d.id WHERE d.id = 1 とすると28,5,0という値が返されます。 どのように書けば正しい4,1,0を得られるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • LEFT JOIN とRIGHT JOINの合体版のような結合方法。

    LEFT JOIN とRIGHT JOINの合体版のような結合方法。 使用DBはMySQL5.0.45です。 2つのテーブルの結合方式で、結合条件に合致しなかった場合、 両方のデータを結果セットに含めることはできますか? LEFT JOINだと、左側のテーブルのデータは結果に返ってきて、右側のデータはNULLになります。 RIGHT JOINだと、右側のテーブルのデータは結果に返ってきて、左側のデータはNULLになります。 これを「左側データあり右側NULL」「左側NULL右側データあり」というレコードを混ぜて結果として返したいです。 具体的には、 以下二つのテーブルがあるとします。 table : test1 value  id ------------------- ああ   3 いい   4 うう     5 table : test2 value  id -------------------- AAA   1 BBB   2 CCC   3 DDD   4 id を結合条件のキーとして、以下のような結果を得たいです。 NULL  NULL  AAA   1 NULL  NULL  BBB   2 ああ   3     CCC   3 いい   4     DDD   4 うう    5    NULL   NULL LEFT JOINだと以下の結果に、 SELECT * FROM test1 LEFT JOIN test2 ON test1.id=test2.id ああ   3     CCC   3 いい   4     DDD   4 うう    5    NULL   NULL RIGHT JOINだと以下の結果になってしまいます。 SELECT * FROM test1 RIGHT JOIN test2 ON test1.id=test2.id NULL  NULL  AAA   1 NULL  NULL  BBB   2 ああ   3     CCC   3 いい   4     DDD   4 以上、ご教示お願い致します。

    • ベストアンサー
    • MySQL
  • LEFT JOIN について

    table a ------ user_id ------ user1 user2 user3 user4 user5 ------ table b --------------- user_id role_id --------------- user1 role1 user2 role1 user3 role1 user2 role2 user4 role2 --------------- とします。 1つのSQL文で、a のすべてのユーザそれぞれが指定role_id に属しているかどうかを検索したいです。 例えば、すべてのユーザそれぞれが role1 に属しているかどうかを検索します。 欲しい結果は以下の通りです。 ------------ user1 true user2 true user3 true user4 false user5 false ------------ LEFT JOIN だと思いますが、うまくいきません。 SELECT a.user_id, b.role_id FROM a LEFT JOIN b ON a.user_id = b.user_id WHERE b.role_id='role1'; 結果は以下になります。 ------------ user1 role1 user2 role1 user3 role1 ------------ #Whereで絞って、当然の結果です SQLをどうかければよいでしょうか。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLでLEFT JOIN

    MySQL4.0.26でテーブルの左外部結合がしたいです。 左テーブルAと 右テーブルBをWHERE句で抽出したもの を結合することはできないのでしょうか? 考えた以下の式ではエラーが出てしまいます。 SELECT * FROM A LEFT JOIN ( SELECT * B WHERE id = 1 ) AS B2 ON A.id = B2.id

    • ベストアンサー
    • MySQL
  • left join?で実現できそうなこのクエリを一行で書いてみたい。

    left joinについてお聞きします。一行で実現できるのかどうか、興味があります。 student | id | name | class | | 1 | aaa | 1 | | 2 | bbb | 3 | | 3 | ccc | 4 | | 4 | ddd | 3 | | 5 | eee | 1 | iinkai | id | student.id | name | meeting | | 1 | 1 | tosho | 2006-11-30 | | 2 | 2 | souji | 2006-12-02 | | 3 | 2 | siiku | 2006-12-03 | | 4 | 3 | tosho | 2006-11-30 | ルール ・studentからclassが3,4,5の生徒を抽出 ・iinkaiに所属していなくても生徒は抽出 ・所属していても、全てのmeetingが既に終わっていればいらない ・複数のiinkaiに所属している場合は、2006-12-01以降にmeetingが行われるもので直近のinnkaiを表示する 結果として欲しいテーブルは | student.id | class | iinkai.id | iinkai.name | meeting | | 2 | 3 | 2 | souji | 2006-12-02 | | 3 | 4 | null | null | null | | 4 | 3 | null | null | null | 文字数が足りません。ご教授お願いします。

    • ベストアンサー
    • MySQL
  • 少し複雑な left join

    まだデーターベースを独学で始めて数ヶ月の初心者です。 以下(3行目のleft join)の記述では動かないのですが、どのように 記述したらよいのでしょうか? やりたい内容は3行目にあるようにbookedというテーブルの中のdateが 2013-06-05だけ抽出した形のテーブルを、timeTplというテーブルとleft join させたいです。 1 "select * 2 from 3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b 4 on 5 t.start >= b.startTime and t.start < b.finishTime || 6 t.finish > b.startTime and t.finish <= b.finishTime 7 where 8 t.time > 9 (select start 10 from class as c left join member as m 11 on c.className = m.class 12 where m.name = '$name') 13 ) 14 "; よろしくお願いします。

  • 複数のテーブルに対してのleft join

    前回他の方が質問していますが、、、 T1、T2、T3、T4がありまして T1が軸のテーブルです。 その場合 select T1.a,T2.b,T3.c from T1,T2,T3 left join T4 on T1.x = T2.x and T2.xx = T3.xx and T2.xxx = T4.xxx where T4.x is null というふうなSQLを発行しようとしたのです。 しかし「onが無効」と怒られました。 ご存知の方教えてください。 HPなどご存知の方お願いいたします。 DB2/UDBです。

  • LEFT JOIN の結合結果について

    お世話になります。 ”SELECT Aテーブル.* Bテーブル.*  FROM Aテーブル LEFT JOIN Bテーブル ON Aテーブル.KEY = Bテーブル.KEY”を 行った場合、Aテーブルにしか存在しないデータのBテーブル側の値は常にNULLに なるようなのですが、この場合ゼロを固定に設定することは出来ないでしょうか? よろしくお願いします。 ※ORACLE 9i、PL/SQL上での処理を考えています

  • Access #エラーについて

    Access初心者です。 よろしくお願いいたします。 [前提]  テーブルA のIDに紐づけてクエリBの数値をクエリCで反映させたい。  〈詳細データ〉   ・テーブルA    [ID] [名称]       1   あ     2   い     3   う     4   え     5   お   ・クエリB    [ID] [数値]     2   10     3   20     5   40   ・クエリC    [ID]  [名称] [数値]     1    あ  #エラー     2    い   10     3    う    20     4    え  #エラー     5    お   40   ・”テーブルAの[ID]”の全レコードと”クエリBの[ID]”の同じ結合フィールドだけを含めてリレーションを行っている。    ・クエリCの算式: IIf(IsError([クエリB].[数値]),0,[クエリB].[数値])  [質問]    ・クエリCの『#エラー』部分を0にしたいのですが、何か良い方法はございませんでしょうか。   ・そもそも上記のロジックは無理がありますでしょうか。    アクセスはあまりいじったことがございません。ご回答いただけますと幸いです。   よろしくお願いいたします。

  • サブクエリを使用せずにLEFT JOIN + GROUP BY + ORDER BYでデータの取得

    課題テーブル: 1 課題1 Aさん 2 課題1 Bさん 3 課題1 Cさん 4 課題1 Dさん 5 課題1 Eさん 6 課題2 Bさん 7 課題2 Cさん 成績テーブル: Aさん 算数 1 Aさん 国語 2 Bさん 算数 3 Cさん 算数 2 Dさん 国語 1 目的: 課題1を算数の成績順に取得したい。 普通にLEFT JOINすると以下のようになる。 1 課題1 Aさん 算数 1 1 課題1 Aさん 国語 2 2 課題1 Bさん 算数 3 3 課題1 Cさん 算数 2 4 課題1 Dさん 国語 1 5 課題1 Eさん NULL NULL ここから名前を1つにまとめて、成績順に。 1 課題1 Aさん 算数 1 3 課題1 Cさん 算数 2 2 課題1 Bさん 算数 3 4 課題1 Dさん NULL NULL 5 課題1 Eさん NULL NULL このようにしたいのですが、名前でGROUP BYすると科目と成績の整合性がとれなくなってしまい、正しく順位づけできません。 ORDER BY CASE  WHEN 成績.科目 = '算数' THEN '0'  WHEN 成績.科目 IS NULL THEN '2'  ELSE '1' END, 成績.科目, 成績.成績 サブクエリを使わずに実行する方法は、何かないものでしょうか。

    • ベストアンサー
    • MySQL

専門家に質問してみよう