如何结合Inner Join与NOT EXISTS实现未录入成功行程的奖励插入SQL?
实现思路与SQL示例
要筛选出rides表中状态为成功(status='success')且未在driver_rewards中生成奖励记录的行程,并插入奖励数据,可通过以下两种常用方法实现:
方法一:LEFT JOIN + IS NULL 筛选
通过左连接rides和driver_rewards表,筛选出奖励表中无对应记录的行程(即连接后奖励表的ride_id为NULL),同时限定行程状态为成功。
INSERT INTO driver_rewards (ride_id, reward_percent, reward_amount) SELECT r.ride_id, -- 替换为实际业务的奖励百分比规则,比如固定值或关联其他表计算 10 AS reward_percent, -- 替换为实际业务的奖励金额计算逻辑,比如基于行程金额的比例 (r.ride_amount * 0.1) AS reward_amount FROM rides r LEFT JOIN driver_rewards dr ON r.ride_id = dr.ride_id WHERE r.status = 'success' AND dr.ride_id IS NULL;
方法二:NOT EXISTS 子查询筛选
利用子查询检查当前行程的ride_id是否未在driver_rewards表中存在,同时限定行程状态为成功。这种写法逻辑更直观,适合复杂条件的场景。
INSERT INTO driver_rewards (ride_id, reward_percent, reward_amount) SELECT r.ride_id, -- 示例:根据司机等级动态计算奖励百分比 CASE WHEN d.level = 'gold' THEN 15 ELSE 10 END AS reward_percent, -- 示例:对应奖励金额计算 (r.ride_amount * CASE WHEN d.level = 'gold' THEN 0.15 ELSE 0.1 END) AS reward_amount FROM rides r -- 若需关联司机表获取信息,可添加JOIN(根据你的表结构调整关联字段) JOIN drivers d ON r.driver_id = d.driver_id WHERE r.status = 'success' AND NOT EXISTS ( SELECT 1 FROM driver_rewards dr WHERE dr.ride_id = r.ride_id );
注意事项
- 先执行
SELECT部分验证筛选结果,确认无误后再执行INSERT操作 - 若需每日定时执行,可添加日期筛选条件(如
r.ride_date = CURDATE()),减少数据扫描范围 - 确保
ride_id是rides表的唯一标识,避免重复插入
内容的提问来源于stack exchange,提问作者Kon
相关产品推荐
相关产品推荐

