如何查询2019-2022有授权记录但之后无记录的客户?
筛选符合特定授权时间条件的客户列表
需求说明:
- 关联
clients表和authorization表(外键为orgid) - 获取2019年1月1日至2022年12月31日期间有授权记录,但2022年12月31日后无任何授权记录的去重客户
- 以
authorization.datecreated作为时间判断依据
你的原SQL语句仅筛选了指定时间段内有授权记录的客户,但未排除后续仍有记录的客户,以下是两种可行的修改方案:
方案一:使用NOT EXISTS子查询
通过子查询检查客户在2022-12-31之后是否存在授权记录,不存在则保留:
SELECT DISTINCT c.* FROM clients AS c JOIN authorization AS a ON c.orgid = a.orgid WHERE a.datecreated BETWEEN '2019-01-01 00:00:00' AND '2022-12-31 23:59:59' AND NOT EXISTS ( SELECT 1 FROM authorization a2 WHERE a2.orgid = c.orgid AND a2.datecreated > '2022-12-31 23:59:59' )
注:把原条件的< '2022-12-31 00:00:00'改成BETWEEN ... AND '2022-12-31 23:59:59',避免漏掉当天的所有记录
方案二:使用LEFT JOIN + IS NULL
先关联客户在指定时间段内的授权记录,再左关联后续的授权记录,过滤掉后续有记录的客户:
SELECT DISTINCT c.* FROM clients AS c JOIN authorization AS a ON c.orgid = a.orgid LEFT JOIN authorization AS a2 ON c.orgid = a2.orgid AND a2.datecreated > '2022-12-31 23:59:59' WHERE a.datecreated BETWEEN '2019-01-01 00:00:00' AND '2022-12-31 23:59:59' AND a2.orgid IS NULL
两种方案都能实现需求,具体性能可根据你的数据量选择,通常NOT EXISTS在多数数据库中优化效果较好。
内容的提问来源于stack exchange,提问作者user1535268
相关产品推荐
相关产品推荐

