実現したいこと
【契約テ-ブル】に対して、
「契約終了年が9999かつA2から始まる契約コードを一つでも持っている顧客番号を抽出。しかし、その顧客番号が、契約開始年が2026であるA21111の契約コードを持っていれば、その顧客番号は除外する」
といった条件のSELECT文は以下のようになるとのことです。
SQL
1SELECT DISTINCT 顧客番号 2 FROM 契約テーブル a 3 WHERE a.契約コード LIKE 'A2%' 4 AND a.契約終了年 = 9999 5 AND NOT EXISTS 6 (SELECT 1 FROM 契約テーブル b 7 WHERE b.契約コード = 'A21111' 8 AND b.契約開始年 = 2026 9 AND a.顧客番号 = b.顧客番号)
【契約テーブル】 顧客番号,契約コード,契約開始年,契約終了年 111111,A20000,2016,2018 111111,A20000,2018,9999 111111,A21111,2018,9999 111111,A20000,2018,9999 111111,A21111,2026,9999 111112,A21111,2018,9999 111112,A20000,2018,9999 111112,A21111,2024,9999 111113,A41111,2018,9999 111113,A40000,2018,9999 111113,A21111,2024,9999 111114,A41111,2018,9999 111114,A40000,2018,9999 111114,A41111,2026,9999 ・ ・ ・
クエリを実行すると、条件通りの抽出ができ
顧客番号
・111112
・111113
の2行が表示されました。
結果的に欲しいデータが抽出できているので良いのですが、なぜ抽出できているのかが分かりません。
「111112と111113が抽出される」のは理解できますが、**「なぜ顧客番号111111が外されているのか」**が分かりませんでした。
相関副問い合わせを用いたEXISTS句のため、
まず主問い合わせから実行され、顧客番号111111に関しては
・111111,A20000,2018,9999
・111111,A21111,2018,9999
・111111,A20000,2018,9999
・111111,A21111,2026,9999
の4行が副問い合わせでの評価の対象になると思います。
次に副問い合わせによって1行ずつ評価されると思いますが、
・(111111,A20000,2018,9999)は副問い合わせの条件に当てはまらないため、NOT EXISTSによって行が返る
・(111111,A21111,2018,9999)は副問い合わせの条件に当てはまらないため、NOT EXISTSによって行が返る
・(111111,A20000,2018,9999)は副問い合わせの条件に当てはまらないため、NOT EXISTSによって行が返る
・(111111,A21111,2026,99999)は副問い合わせの条件に当てはまるため、NOT EXISTSによって行が返らない
結果的に3行が返ることになり、主問い合わせのDISTINCT 顧客番号によって「111111」は表示されるのではないかと思いました。
恐らく、「a.顧客番号 = b.顧客番号」の部分が関係しており、私の認識が間違っているとは何となくわかっているのですが、正しい考え方が不明です。
ご教示いただけると幸いです…

回答3件
あなたの回答
tips
プレビュー