今天收到一個需求
需要查詢產品資料
條件是沒有1對1服務
table的結構如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
╔════════════╤═╤═══════════╤═╤════════════════════════════╗
║ Product │ │ Service │ │ ProductService ║
╠════╤═══════╡ ╞════╤══════╡ ╞════╤═══════════╤═══════════╣
║ Id │ Name │ │ Id │ Name │ │ Id │ ProductId │ ServiceId ║
╟────┼───────┤ ├────┼──────┤ ├────┼───────────┼───────────╢
║ 1 │ TOEIC │ │ 1 │ 1on1 │ │ 1 │ 1 │ 1 ║
╟────┼───────┤ ├────┼──────┤ ├────┼───────────┼───────────╢
║ 2 │ IELTS │ │ 2 │ 1on2 │ │ 2 │ 1 │ 2 ║
╟────┼───────┤ ├────┼──────┤ ├────┼───────────┼───────────╢
║ 3 │ TOEFL │ │ 3 │ 1on4 │ │ 3 │ 1 │ 3 ║
╟────┼───────┤ ├────┼──────┤ ├────┼───────────┼───────────╢
║ │ │ │ │ │ │ 4 │ 2 │ 2 ║
╟────┼───────┤ ├────┼──────┤ ├────┼───────────┼───────────╢
║ │ │ │ │ │ │ 5 │ 3 │ 2 ║
╟────┼───────┤ ├────┼──────┤ ├────┼───────────┼───────────╢
║ │ │ │ │ │ │ 6 │ 3 │ 3 ║
╚════╧═══════╛ ╘════╧══════╛ ╘════╧═══════════╧═══════════╝

問ChatGPT或是上網查
都說用group by
但不知為啥結果總是錯的

後來靈光一閃
其實用最簡單的left join就可以了

1
2
3
4
select 100
from Product as A
left join ProductService as B on A.Id = B.ProductId and B.ServiceId = 1
where B.ServiceId is null

這樣就可以找出
沒有1對1服務的產品了

那如果更進一步
要找出沒有1對1
但是有1對4服務的產品
同樣的思路可以再用一次
多一個join

1
2
3
4
5
select 100
from Product as A
left join ProductService as B on A.Id = B.ProductId and B.ServiceId = 1
left join ProductService as B2 on A.Id = B2.ProductId and B2.ServiceId = 3
where B.ServiceId is null and B2.ServiceId is not null

比起group by
left join還是平易近人多了
也比較不容易出錯

另外上面範例的table
是使用Plain Text Table產生的
簡單好用
是寫文章的好幫手