HOME > 即効テクニック > AccessVBA > データ操作 > 2つのテーブルを比較し、片方にしか存在しないレコードを抽出する (SQL)

即効テクニック

データ操作

2つのテーブルを比較し、片方にしか存在しないレコードを抽出する (SQL)

(Access 97)
●概要●
同じフィールドを持つ2つのテーブルを比較し、片方にしかないレコードを削除する方法を説明します。

●準備●
  1. 以下の構成で[商品マスタ]テーブルを作成します。 ---------------------------------------- フィールド名 データ型 商品ID 整数型(主キー) 商品名 テキスト型 販売価格 通貨型 ----------------------------------------
  2. 以下の構成で[販売履歴]テーブルを作成します ---------------------------------------- フィールド名 データ型 販売履歴ID オートナンバー(主キー) 商品ID 整数型 販売数量 整数型 ----------------------------------------
  3. 両方のテーブルに適当なデータを入力します。 その際、[販売履歴] テーブルにはなくて、[商品マスタ] テーブルには 存在するレコードを作っておいて下さい。
●サンプルコード● 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のチェックを持ってきて下さい。