HOME > 即効テクニック > AccessVBA > クエリ・SQL > 複数の条件に一致するレコードを抽出する

即効テクニック

クエリ・SQL

複数の条件に一致するレコードを抽出する

(Access 2000/2002)
●概要●
構文  WHERE 式 IN (リスト)
      WHERE 式 NOT IN (リスト)

IN演算子は、かっこ内のリストのいずれかと一致するレコードを検索します。
たとえば、フィールド1に対してIN演算子のリストに('A','B','C')と指定した場合、「フィールド1='A'  OR  フィールド1='B'  OR  フィールド1='C'」のように3つの条件をOR演算子で指定したのと同じになります。
一方、NOT IN演算子はかっこ内のリストのすべてと一致しないレコードを検索し、ます。NOT IN演算子のリストに('A','B','C')と指定した場合、「フィールド1<>'A'  AND  フィールド1<>'B'  AND  フィールド1<>'C'」のように3つの条件をAND演算子で指定したのと同じになります。
サンプルでは、リストに「社員コード」を指定し、IN演算子を使用してリストのいずれかと一致するコードを、またNOT IN演算子を使用してリストのすべてと一致しないレコードを検索します。
●サンプル●
'複数の条件に一致するレコードを抽出する
Public Sub Sample()

    Dim myDB As Database
    Dim myRS As DAO.Recordset
    Dim mySQL1, mySQL2 As String

    'SQLステートメントを定義する
    mySQL1 = "SELECT * FROM 社員テーブル " & _
             "WHERE 社員コード IN (10001,10002,20001,20002);"
    mySQL2 = "SELECT * FROM 社員テーブル " & _
             "WHERE 社員コード NOT IN (10001,10002,20001,20002);"

    'カレントデータベースを変数に代入する
    Set myDB = CurrentDb
    'SQLステートメントを実行してレコードセットを開く
    Set myRS = myDB.OpenRecordset(mySQL1, dbOpenDynaset)
    'レコードセットの内容を表示する
    Debug.Print "*** IN 検索 ***"
    Do Until myRS.EOF
        Debug.Print myRS!社員コード & " " & myRS!部署コード & " " _
               & myRS!名前 & " " & myRS!入社年月日 & " " & myRS!職種
        myRS.MoveNext
    Loop
    'SQLステートメントを実行してレコードセットを開く
    Set myRS = myDB.OpenRecordset(mySQL2, dbOpenDynaset)
    'レコードセットの内容を表示する
    Debug.Print "*** NOT IN 検索 ***"
    Do Until myRS.EOF
        Debug.Print myRS!社員コード & " " & myRS!部署コード & " " _
               & myRS!名前 & " " & myRS!入社年月日 & " " & myRS!職種
        myRS.MoveNext
    Loop
    'レコードセットを閉じる
    myRS.Close

End Sub
●補足●
抽出結果は[イミディエイト]ウィンドウに表示されます。