- ベストアンサー
AccessのDlookupの引数設定について
- AccessのDlookup関数を使ってエクセルのVlookupのようなことを実現する方法を教えてください。
- テーブルAとBのレコード数は約30万件あり、数件の差異があることがわかりました。
- Dlookup関数の引数をどのように設定すればよいか教えてください。
- みんなの回答 (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の方のおっしゃる不一致クエリです。 ウィザードでも作ることができることになっていますが、このウィザードのメッセージが私には全く意味不明な日本語なので、私はウィザード使いません。 上のように自分で作ったって、かかる時間は同じですから。
その他の回答 (6)
- chayamati
- ベストアンサー率41% (260/624)
-Ken-Ken- さん お説ごもっともです。少しコチンと来ましたが、ありがとうございます。 -------------------------------------- hajime0405 さん 追伸です No.5の添付は件数がT_Aの方が多いときの設定です 2.T_Aの全レコードとT_B同じ結合フィールドのレコードだけを含める これで表示された件数と「数件の差異」が一致すれば一応解決ですね VALに重複のレコードがあれば解決したことになりません 重複があるかどうかのチェックはVALの インデックスを「重複なし」と変更は受け付けられませんので… インデックスを「重複なし」の設定の流れはテーブルのデザインビューから入り [VAL]→[インデックスの右端▼]→[は(重複なし)]→[閉じる]→[はい]で 重複があればコメントが表示され閉じることが出来ません
お礼
補足情報ありがとうございます。 >これで表示された件数と「数件の差異」が一致すれば一応解決ですね おかげさまで、一致いたしました。 照合キーの重複許可可否の件もありがとうございました。
あははは、#5さん、#1のお礼のところ読みました? この人「不一致クエリ」っていうキーワードだけがほしかったんですよ。 私、不一致クエリの内容をかんで含めるように説明を試みたし、#3さんはナイスなSQL提案してるんだけど、そんなのどうでもよかったんだね。
- chayamati
- ベストアンサー率41% (260/624)
補足が無いので勝手に進めます。 DlookUp関数自分も初めてですが コンボボックスに似たような機能ではないでしょうか 不一致分だけ抽出するのでしょうか 30万件のレコード全てが対象だと大変ですね テーブル対テーブルの照合には 適さないのではないでしょうか ------------------------------------ 件数が合わないとは 1.どちらかに重複のレコードが存在する 2.不一致レコードが存在する ----------------------------------- テーブル構成がわからないですが 1.が原因しているように思われます 照合キーに対する件数チェック 照合キーがユニークという前提があるなら テーブルのプロパティーで 照合キーのインデックスを「重複なし」にするに 2.不一致レコードが存在する 不一致クエリー試されましたか IDは通常オートナンバー型の主キーですのでこれは 照合キーではありませんね、VALを照合キーとします [作成リボン]→[クエリーデザイン]→[T_A,T_B選択] →[追加]→[閉じる]と入って 照合キーをドラッグしてテーブル間をリレーション し、リレーション線を右クリックしてリレーション 種類を決めます 以下添付図を参照してください
お礼
折角、ご教示いただいているのに気付かず申し訳ありません。 今回私が遭遇したケースは、 >2.不一致レコードが存在する でしたので、ご指摘の方法をためし、うまくいきました。 また、「照合キーのインデックスを「重複なし」にする」方法についても今後役に立ちそうです。 Access初心者に丁寧なご教示をいただきましたこと感謝申し上げます。
- chayamati
- ベストアンサー率41% (260/624)
補足願います IDは主キーですよね またオートナンバー形式でないということでよろしいですか ならば不一致クエリー2つ(AにあってBにない、AになくてBにある) でよいのではないのでしょうか
- nicotinism
- ベストアンサー率70% (1019/1452)
元データが テーブル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;
お礼
お返事遅くなり申し訳ございません。 ご教示いただいたSQLステートメントを実行すると、不一致クエリと同じ結果が返りました。 SQLの内容が全くもってわかりませんが、今後勉強したいと思います。 どうもありがとうございました。
- masatsan
- ベストアンサー率15% (179/1159)
クエリーの作成で 不一致クエリー というのがあるんですけど。
お礼
おおお、そんな便利なクエリがあったんですね。手元のマニュアル本にもでかでかと紹介されていました。ありがとうございました!
お礼
お返事遅くなりすいません! 当座を不一致クエリでしのぎ、後日あらためて-ken-ken-さんの方法で試してみましたら(Dlookupの方ではありません)、無事正しい結果が返ってきました。今後活用させていただきます。ご教示ありがとうございました。