• 締切済み

少し複雑な検索条件

初歩的な質問だと思われるため、恐縮ですがご教授ください。 以下のような2つのテーブルがあります。 <テーブルA> 会員NO 生年月日 1 20000101 2 20000102 3 20000103 4 20000104 <テーブルB> 会員NO 生年月日 1 20000101 2 20000102 2 99999999 3 99999998 3 99999999 この状態で、 「テーブルA」の「会員NO」すべての内、 「テーブルB」の「会員NO」と一致し、かつ「生年月日」が1つも一致しない「会員NO」を拾い出したいと考えています。 ↑のテーブルでは、「会員NO」 3 のみが該当する条件となります。 1 → 会員NOと生年月日が一致する 2 → テーブルBで会員NOが一致する2件のうち、片方の生年月日が一致する 4 → 会員NOが一致しない どうか、よろしくお願いいたします。

みんなの回答

  • Tom-3
  • ベストアンサー率32% (42/130)
回答No.2

>「テーブルA」の「会員NO」すべての内、 >「テーブルB」の「会員NO」と一致し、かつ「生年月日」が1つも一致しない「会員NO」を拾い出したいと >考えています。 また、 >1 → 会員NOと生年月日が一致する >2 → テーブルBで会員NOが一致する2件のうち、片方の生年月日が一致する >4 → 会員NOが一致しない とありますので 抽出するデータは必ずテーブルBに存在する必要があります。 その事を考慮に入れ、まず、テーブルBとテーブルAを会員NOと生年月日でLEFT JOINし、 テーブルA.生年月日がNULLになるレコードの会員NOおよびその件数を抽出するクエリを作成します。  SELECT    BA.会員NO   ,COUNT(*) AS レコード件数  FROM テーブルB  AS BA  LEFT JOIN テーブルA AS BB  ON BA.会員NO=BB.会員NO  AND BA.生年月日=BB.生年月日  WHERE BB.生年月日 IS NULL  GROUP BY BA.会員NO これで 会員NO,レコード件数 2 ,1 3 ,2 というデータが抽出されます。 次にテーブルBが会員NO毎に何件ずつあるかを抽出します。   SELECT      BC.会員NO     ,COUNT(*) AS レコード件数   FROM テーブルB AS BC   GROUP BY BC.会員NO これで 会員NO,レコード件数 1 ,1 2 ,2 3 ,2 となります。 最後に上記で作成した2つのクエリより会員NOとレコード件数をINNER JOINで結合します。 SELECT B1.会員NO FROM(    SELECT       BA.会員NO      ,COUNT(*) AS レコード件数    FROM テーブルB AS BA    LEFT JOIN テーブルA AS BB    ON BA.会員NO=BB.会員NO    AND BA.生年月日=BB.生年月日    WHERE BB.生年月日 IS NULL    GROUP BY BA.会員NO    ) AS B1 INNER JOIN    (    SELECT       BC.会員NO      ,COUNT(*) AS レコード件数    FROM テーブルB AS BC    GROUP BY BC.会員NO    ) AS B2 ON B1.会員NO=B2.会員NO AND B1.レコード件数=B2.レコード件数 これで 会員NO,レコード件数 3 ,2 のデータのみが抽出できるようになります。 クエリを見やすいように前方のスペースは全角スペースにしています。 利用される際は全角スペースを半角スペースに変換してください。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

SELECT A.会員NO FROM テーブルA A WHERE EXIST(SELECT * FORM テーブルB B1 WHERE B1.会員NO = A.会員NO) AND NOT EXIST(SELECT * FORM テーブルB B2 WHERE B2.会員NO = A.会員NO AND B2.生年月日 = A.生年月日)

関連するQ&A