IN可能存在的效能疑慮(效能差),可以使用EXISTS取代。
範例
取得包含於負責人清單,但不包含分店負責人清單中的負責人的總販賣業績(販賣單價*數量)。
(差集Except概念)
Exists + Execpt 差集
1
2
3
4
5
6
7
8
9
select sum(B.販賣單價*A.數量) "總業績"
from [dbo].[販賣資料] A
join [dbo].[商品清單] B on B.商品ID = A.商品ID
where exists
(
select [負責人ID] from [dbo].[負責人清單]
except
select [分店負責人ID] from [dbo].[分店負責人清單]
)
執行結果
1
2
總業績
4625000
In + Execpt 差集
1
2
3
4
5
6
7
8
9
10
select sum(B.販賣單價 * A.數量) "總業績"
from [販賣資料] A
join [商品清單] B on B.商品ID = A.商品ID
where [負責人ID] in
(
select [負責人ID] from [dbo].[負責人清單]
except
select [分店負責人ID] from [dbo].[分店負責人清單]
)
In + Not In
1
2
3
4
5
6
--取得包含於負責人清單,但不包含分店負責人清單中的負責人的總販賣業績(販賣單價*數量)
select sum(B.販賣單價 * A.數量) "總業績"
from [販賣資料] A
join [商品清單] B on B.商品ID = A.商品ID
where A.負責人ID in (select 負責人ID from [負責人清單]) --包含於負責人清單
and A.負責人ID not in (select [分店負責人ID] from [分店負責人清單]) --不包含分店負責人清單
Exists + Not Exists
1
2
3
4
5
6
--取得包含於負責人清單,但不包含分店負責人清單中的負責人的總販賣業績(販賣單價*數量)
select sum(B.販賣單價 * A.數量) "總業績"
from [販賣資料] A
join [商品清單] B on B.商品ID = A.商品ID
where exists (select 負責人ID from [負責人清單] T1 where T1.負責人ID = A.負責人ID) --包含於負責人清單
and not exists (select [分店負責人ID] from [分店負責人清單] T2 where T2.分店負責人ID = A.負責人ID ) --不包含分店負責人清單