You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

三表关联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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:30:04