基于指定条件从tblA表筛选数据的SQL查询正确性确认
嘿,针对你的需求,我整理了几种靠谱的SQL方案,既能准确筛选出符合条件的客户,也能应对你数万条记录的表性能需求~
核心需求拆解
我们要找的是同时满足两个条件的客户:
- 该客户至少有一条
ApptType=2的记录 - 该客户至少有一条
ApptType=1的记录,且这条记录的日期落在2016-01-01到2016-02-15之间
方案一:用EXISTS子查询(推荐,性能友好)
这种写法用半连接逻辑,找到匹配的记录就停止检索,效率很高,而且逻辑清晰:
SELECT DISTINCT customer_id FROM tblA WHERE ApptType = 2 AND EXISTS ( SELECT 1 FROM tblA AS t1 WHERE t1.customer_id = tblA.customer_id AND t1.ApptType = 1 AND t1.appt_date BETWEEN '2016-01-01' AND '2016-02-15' );
- 外层先筛选出所有有
ApptType=2的客户记录 - 内层子查询验证该客户是否存在符合日期范围的
ApptType=1记录 - 用
DISTINCT是为了避免同一个客户因多条ApptType=2记录重复出现
方案二:GROUP BY + HAVING(适合聚合场景)
如果之后需要扩展统计需求,这种分组验证的方式更灵活:
SELECT customer_id FROM tblA GROUP BY customer_id HAVING MAX(CASE WHEN ApptType = 2 THEN 1 ELSE 0 END) = 1 AND MAX(CASE WHEN ApptType = 1 AND appt_date BETWEEN '2016-01-01' AND '2016-02-15' THEN 1 ELSE 0 END) = 1;
- 按客户分组后,用
CASE标记符合条件的记录 - 用
MAX判断该客户是否至少存在一条满足条件的记录(只要有一条符合,MAX就为1) - 不需要额外去重,因为
GROUP BY已经保证每个客户只出现一次
方案三:自连接查询(逻辑直观)
通过自连接关联同一张表的两类记录,也是可行的方案:
SELECT DISTINCT t2.customer_id FROM tblA AS t2 JOIN tblA AS t1 ON t2.customer_id = t1.customer_id WHERE t2.ApptType = 2 AND t1.ApptType = 1 AND t1.appt_date BETWEEN '2016-01-01' AND '2016-02-15';
t2表取ApptType=2的记录,t1表取符合日期的ApptType=1记录- 通过
customer_id关联两类记录,最后用DISTINCT去重
性能优化建议
针对数万条记录的表,建议给customer_id、ApptType、appt_date建立复合索引,能大幅提升查询速度:
CREATE INDEX idx_tbla_customer_apptype_date ON tblA(customer_id, ApptType, appt_date);
注意事项
如果你的appt_date是带时间的datetime类型,要注意边界问题:
BETWEEN '2016-01-01' AND '2016-02-15'默认只包含2016-02-15 00:00:00之前的记录- 如果要包含当天所有时间的记录,建议改成
appt_date < '2016-02-16',避免时间精度遗漏
内容的提问来源于stack exchange,提问作者Koosh
相关产品推荐
相关产品推荐

