プロが教えるわが家の防犯対策術!

テーブルA

ID | val
---------  
01 | 001
02 | 002
03 | 003
04 | 004
05 | 005


テーブルB

ID | val
---------  
01 | 001
02 | 002
03 | 003
05 | 005

テーブルAとBのレコード数はいずれも約30万件あります。
本来AとBは同数のレコードをもつはずなのですが、数件の差異があることがわかりました。
それが何かを調べたいのですが、その方法についてご教示ください。

エクセルであれば、Vlookupを使い

テーブルA
ID | val | Vlookup式
--------------------  
01 | 001 | 001
02 | 002 | 002
03 | 003 | 003
04 | 004 | Null
05 | 005 | 005

という方法で発見できるのですが、なにせ件数が多いため、慣れないAccessを使ってやろうと考えました次第です。

で調べると、Vlookupに似たDlookup関数というのがあるではありませんか。

そこで、「クエリデザインの作成」→「テーブルの表示」ウィンドウの「テーブル」タブから「テーブルA」を選択→項目「ID」「val」をデザイングリッドに展開しました。
そして、新規フィールドを選択→ビルダーをクリック→ここでDlookupを選択しました。

しかし、以下の式の引数をどのように設定すればよいのかではたと立ち止まってしまいました。

 DLookUp(«expression», «domain», «criteria»)

どう設定すれば、エクセルにおけるVlookupのようなことが実現できるでしょうか。
あるいは、もっと適当な方法がありましたらご教示いただければ幸いです。

ちなみに、環境はAccess2010を使っています。
よろしくお願いします。

A 回答 (7件)

アクセスはエクセルじゃないですから、似たような関数を持ってきて貼り付けてもだめです。


しかし、DLookUpをあなたがやりたいように使うことはできます。
テーブルAをもとにしたクエリーをつくることにして、

DLookUp("val", "テーブルB", "ID=" & [ID])

テーブルBの、IDが同じレコードの、valを返せ、という意味になります。
IDが文字列変数なら、''で挟む必要があります。

しかし、#1の方もご指摘の通り、せっかくデーターベースソフトを使っているのに、そんな風にDLookUp関数を使う人はいません。
30万件もDLookUp関数走らせたら、動かないかもよ。

手元にアクセスがないから、画面をうpできないのですが、散文的に書いてみます。

まずクエリビルダでテーブルAとテーブルBを開きます(あなたがテーブルAだけを選択したところです)。
テーブルAのIDをドラッグして、テーブルBのIDでドロップします。
すると、IDとIDが細い線でつながられるはずです。
テーブルを二つ開いたところで、すでに細い線でID同士がつながれていたら、この作業は不要。

この線を選択して右クリックするとメニューが現れ、リンクの編集、というような意味の項目があるはずです。これをクリック。
そこで、テーブルAのすべてのレコードと、関連するテーブルBのレコードを表示する、というよう意味の項目を選びます(ラジオボタン)。
で、閉じる。
ID同士をつなぐ線が矢印になったはずです(Aに向かう矢印・・・・・だったはず)。

デザイングリッドには、テーブルAからIDとvalをドラッグ・ドロップ、テーブルBからはvalをドラッグ・ドロップします。
テーブルB.valの抽出条件は IsNull (Is Nullだったかな?)とします。

それでクエリの実行。

ID | A.val | B.val
--------------------  
04 | 004 | Null

という感じで結果が表示されます。

これが、#1の方のおっしゃる不一致クエリです。
ウィザードでも作ることができることになっていますが、このウィザードのメッセージが私には全く意味不明な日本語なので、私はウィザード使いません。
上のように自分で作ったって、かかる時間は同じですから。
    • good
    • 0
この回答へのお礼

お返事遅くなりすいません! 当座を不一致クエリでしのぎ、後日あらためて-ken-ken-さんの方法で試してみましたら(Dlookupの方ではありません)、無事正しい結果が返ってきました。今後活用させていただきます。ご教示ありがとうございました。

お礼日時:2013/03/26 15:46

-Ken-Ken- さん


お説ごもっともです。少しコチンと来ましたが、ありがとうございます。
--------------------------------------
hajime0405 さん 追伸です
No.5の添付は件数がT_Aの方が多いときの設定です
 2.T_Aの全レコードとT_B同じ結合フィールドのレコードだけを含める
  これで表示された件数と「数件の差異」が一致すれば一応解決ですね

VALに重複のレコードがあれば解決したことになりません
重複があるかどうかのチェックはVALの
インデックスを「重複なし」と変更は受け付けられませんので…

インデックスを「重複なし」の設定の流れはテーブルのデザインビューから入り
[VAL]→[インデックスの右端▼]→[は(重複なし)]→[閉じる]→[はい]で
重複があればコメントが表示され閉じることが出来ません
「AccessのDlookupの引数設定に」の回答画像7
    • good
    • 0
この回答へのお礼

補足情報ありがとうございます。

>これで表示された件数と「数件の差異」が一致すれば一応解決ですね

おかげさまで、一致いたしました。
照合キーの重複許可可否の件もありがとうございました。

お礼日時:2013/03/26 15:54

あははは、#5さん、#1のお礼のところ読みました?


この人「不一致クエリ」っていうキーワードだけがほしかったんですよ。
私、不一致クエリの内容をかんで含めるように説明を試みたし、#3さんはナイスなSQL提案してるんだけど、そんなのどうでもよかったんだね。
    • good
    • 0

補足が無いので勝手に進めます。


DlookUp関数自分も初めてですが
コンボボックスに似たような機能ではないでしょうか
不一致分だけ抽出するのでしょうか
30万件のレコード全てが対象だと大変ですね
テーブル対テーブルの照合には
適さないのではないでしょうか
------------------------------------
件数が合わないとは
1.どちらかに重複のレコードが存在する
2.不一致レコードが存在する
-----------------------------------
テーブル構成がわからないですが
 1.が原因しているように思われます
  照合キーに対する件数チェック
  照合キーがユニークという前提があるなら
  テーブルのプロパティーで
  照合キーのインデックスを「重複なし」にするに

 2.不一致レコードが存在する
  不一致クエリー試されましたか
   IDは通常オートナンバー型の主キーですのでこれは
  照合キーではありませんね、VALを照合キーとします
  [作成リボン]→[クエリーデザイン]→[T_A,T_B選択]
  →[追加]→[閉じる]と入って
  照合キーをドラッグしてテーブル間をリレーション
  し、リレーション線を右クリックしてリレーション
  種類を決めます 以下添付図を参照してください
「AccessのDlookupの引数設定に」の回答画像5
    • good
    • 0
この回答へのお礼

折角、ご教示いただいているのに気付かず申し訳ありません。
今回私が遭遇したケースは、

>2.不一致レコードが存在する

でしたので、ご指摘の方法をためし、うまくいきました。

また、「照合キーのインデックスを「重複なし」にする」方法についても今後役に立ちそうです。
Access初心者に丁寧なご教示をいただきましたこと感謝申し上げます。

お礼日時:2013/03/26 15:51

補足願います


IDは主キーですよね
またオートナンバー形式でないということでよろしいですか

ならば不一致クエリー2つ(AにあってBにない、AになくてBにある)
でよいのではないのでしょうか
    • good
    • 0

元データが



テーブルA
ID,Val
1,1
3,2
4,4
5,5

テーブルB
ID,Val
1,1
2,2
3,3
5,5
だとして下記のをSQLビューに貼り付けてデータシートビューで見ると

ID,Aval,Bval,C
2, ,  2, 0
3, 2,  3, 0
4, 4,  , 0
のようになります。DlookUpよりかは速いと思います、たぶん。
不一致クエリウィザードだと一方通行ですが、これなら相互チェックできます。

SELECT T1.ID, T2.Val AS Aval, T3.Val AS Bval, IIf(T2.Val=T3.Val,-1,0) AS C
FROM (
(SELECT ID FROM テーブルA
UNION
SELECT ID FROM テーブルB
) AS T1
LEFT JOIN テーブルA AS T2 ON T1.ID = T2.ID)
LEFT JOIN テーブルB AS T3 ON T1.ID = T3.ID
WHERE IIf([T2].[Val]=[T3].[Val],-1,0)=0
ORDER BY T1.ID;
    • good
    • 0
この回答へのお礼

お返事遅くなり申し訳ございません。
ご教示いただいたSQLステートメントを実行すると、不一致クエリと同じ結果が返りました。
SQLの内容が全くもってわかりませんが、今後勉強したいと思います。
どうもありがとうございました。

お礼日時:2013/03/26 16:02

クエリーの作成で 不一致クエリー というのがあるんですけど。

    • good
    • 0
この回答へのお礼

おおお、そんな便利なクエリがあったんですね。手元のマニュアル本にもでかでかと紹介されていました。ありがとうございました!

お礼日時:2013/03/22 18:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!