三表关联SQL查询需求咨询:基于车辆表统计及地址匹配校验
嗨,看你已经搞定了第一步的内连接统计,那咱们把两个任务的SQL逻辑理得更清晰些吧!
任务1:基于vehicle表日期列统计addressrole记录数
既然你已经通过内连接得到了预期结果,这里给个通用的示例代码(假设关联字段是vehicle.id和addressrole.vehicle_id,日期列是vehicle.vehicle_date),方便你对照调整:
SELECT v.vehicle_date, COUNT(ar.id) AS addressrole_record_count FROM vehicle v INNER JOIN addressrole ar ON v.id = ar.vehicle_id -- 可以在这里添加日期范围筛选,比如 WHERE v.vehicle_date BETWEEN '2024-01-01' AND '2024-01-31' GROUP BY v.vehicle_date;
这个语句会按vehicle_date分组,统计每个日期对应的addressrole记录总数,和你已经实现的逻辑应该是一致的。
任务2:筛选addressrole中未在address表存在的记录
要结合任务1的结果来做这个筛选,咱们可以用**CTE(公共表表达式)**先把任务1的结果存为临时数据集,再和address表做左连接,筛选出address表中无匹配的记录:
WITH filtered_addressrole AS ( -- 先获取符合vehicle日期条件的addressrole记录(任务1的基础数据集) SELECT ar.* FROM vehicle v INNER JOIN addressrole ar ON v.id = ar.vehicle_id -- 这里可以添加任务1中的日期筛选条件 ) SELECT far.* FROM filtered_addressrole far LEFT JOIN address a ON far.address_id = a.id -- 假设关联字段是addressrole.address_id和address.id WHERE a.id IS NULL;
关键逻辑说明:
- 左连接
address表后,address.id IS NULL就代表这条addressrole记录在address表中没有匹配项,也就是你要找的“未存在”的记录。 - 如果不需要单独保留任务1的统计数,也可以把两个步骤合并成一个嵌套查询,效果是一样的:
SELECT ar.* FROM vehicle v INNER JOIN addressrole ar ON v.id = ar.vehicle_id LEFT JOIN address a ON ar.address_id = a.id WHERE a.id IS NULL -- 加上任务1的日期筛选条件,比如 AND v.vehicle_date = '2024-01-01' GROUP BY ar.id; -- 如果需要去重的话可以加,根据你的数据情况调整
内容的提问来源于stack exchange,提问作者Subash Suyambuthangam
相关产品推荐
相关产品推荐

