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

如何结合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:25:51