業務中に以下のような例の要件を満たすSQLを書く必要があった。
尚、SQLSERVER利用。
TBL_A,TBL_B,TBL_Cがあるとする。
TBL_A
NO COL_1(PK) COL_2 COL_3 1 01 ~~ ~~ 2 02 ~~ ~~ 3 03 ~~ ~~
TBL_B
NO COL_1(PK) COL_2(PK) COL_3 1 01 AA ~~ 2 01 BB ~~ 3 02 AA ~~ 4 02 BB ~~ 5 03 AA ~~ 6 03 BB ~~
TBL_C
NO COL_1(PK) COL_2(PK) COL_3 1 01 AA XX 2 01 BB ZZ 3 02 AA XX 4 02 BB XX 5 03 AA YY 6 03 BB XX
やりたいこと:
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" -- 除外したい条件
)