●概要●
同じフィールドを持つ2つのテーブルを比較し、片方にしかないレコードを削除する方法を説明します。
●準備●
- 以下の構成で[商品マスタ]テーブルを作成します。
----------------------------------------
フィールド名 データ型
商品ID 整数型(主キー)
商品名 テキスト型
販売価格 通貨型
----------------------------------------
- 以下の構成で[販売履歴]テーブルを作成します
----------------------------------------
フィールド名 データ型
販売履歴ID オートナンバー(主キー)
商品ID 整数型
販売数量 整数型
----------------------------------------
- 両方のテーブルに適当なデータを入力します。
その際、[販売履歴] テーブルにはなくて、[商品マスタ] テーブルには
存在するレコードを作っておいて下さい。
●サンプルコード●
Private Sub PickUp()
'■ 変数宣言 ■
Dim qDef As DAO.QueryDef
Dim DB As DAO.Database
Dim strSQL As String
'■ SQL文作成 ■
strSQL = strSQL & "Select * From 商品マスタ "
strSQL = strSQL & "Where [商品ID] Not In(Select 商品ID From 販売履歴)"
'■ 新規クエリの作成 ■
Set DB = CurrentDb
Set qDef = DB.CreateQueryDef("NewQuery", strSQL)
DB.QueryDefs.Refresh
'■ クエリを開く ■
DoCmd.OpenQuery "NewQuery"
'■ 終了処理 ■
Set qDef = Nothing
Set DB = Nothing
End Sub
●動作確認●
上記プロシージャを実行して下さい。
サンプル通りのデータを入力すると、下記のようなクエリが表示されているはずです。
●詳細●
サンプルではサブクエリを使用して、片方のテーブルにしかないレコードをピックアップしています。
通常Where句では1つのレコードの値同士しか比較できませんが、サブクエリとIn句を使用することで、「From句のテーブルの1レコード 対 サブクエリ全体のレコード」という形の比較を行うことができ、事実上全件を横断して比較することが可能になります。
●備考●
Access2000の場合、デフォルトではDAOに参照設定されていません。
Visual Basic Editor(VBE)を開き、メニューの[ツール]−[参照設定]から、Microsoft DAO 3.6 Object Libraryにチェックを入れて下さい。
その際にMicrosoft ActiveX Data Object 2.1 Libraryよりも上に、DAOのチェックを持ってきて下さい。