【備忘録】not inの使い方【SQL】

業務中に以下のような例の要件を満たすSQLを書く必要があった。
尚、SQLSERVER利用。

TBL_A,TBL_B,TBL_Cがあるとする。

TBL_A

NOCOL_1(PK)COL_2COL_3
101~~~~
202~~~~
303~~~~

TBL_B

NOCOL_1(PK)COL_2(PK)COL_3
101AA~~
201BB~~
302AA~~
402BB~~
503AA~~
603BB~~

TBL_C

NOCOL_1(PK)COL_2(PK)COL_3
101AAXX
201BBZZ
302AAXX
402BBXX
503AAYY
603BBXX

やりたいこと:
TBL_Aに対してTBL_Bを内部結合して、TBL_Bに対してTBL_Cを内部結合し、TBL_C.COL_3 = “XX”のデータを取得する。
ただし、TBL_C.COL_3 = “YY”を含むCOL_1のPKを持つデータは、除外する。

何が言いたいかと言うと、
PKのCOL_1で”01″と”02″のデータは、TBL_C.COL_3 = “YY”を含まないため、TBL_C.COL_3 = “XX”のデータが欲しい。
PKのCOL_1で”03″のデータは、TBL_C.COL_3 = “YY”を含むため、TBL_C.COL_3 = “XX”のデータも除外したい。

以下のように実装する。

select *
from TBL_A
    inner join TBL_B
        on TBL_A.COL1 = TBL_B.COL1
    inner join TABLE_C
        on TBL_B.COL1 = TBL_C.COL1
        on TBL_B.COL2 = TBL_C.COL2
where
    not in
    (
        select distinct 
            TBL_B.COL1
        from TABLE_A
            inner join TBL_B
                on TBL_A.COL1 = TBL_B.COL1
            inner join TABLE_C
                on TBL_B.COL1 = TBL_C.COL1
                on TBL_B.COL2 = TBL_C.COL2
        where
            TABLE_C.COL3 = "YY" -- 除外したい条件
    )

 

Tagged on: ,

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です