刚才在琢磨客户分析的时候,突然想到一个假设,如果某个客户的续约率很高,那么证明他在产品的使用上效果是很好的,如果这些些产品的组合十分有效,那么查看其他类似的客户的续约率,做一次论证应该是有意义的。于是就有了下面的一段SQL,虽然自认数据库功底尚可,当初头疼的not exists如今依然有点拐不过来弯,差点给自己绕沟里。
写上备忘吧,由于sql没有全称量词(for all),只能将这种查询需求转换为存在量词,也即做这样的转换,查询至少选择了客户“zpA”所有套餐的客户名称等同于查询这样一种客户的名称,不存在客户zpA的任一种套餐,是这种客户没有选择过的。(双重not exists)
SELECT DISTINCT Cno
FROM customer cusA
WHERE NOT EXISTS
(SELECT *
FROM customer cusB
WHERE cusB.Cno = 'zpA' AND
NOT EXISTS
(SELECT *
FROM customer cusC
WHERE cusC.Cno=cusA.Cno AND
cusC.Product=cusB.Product));