MySQL表关联查询:根据fl_unique标志处理债务值需求
MySQL关联查询处理债务值的解决方案
需求回顾
针对cars和car_debts两张表,实现以下逻辑:
- 若某车辆的
car_debts中存在fl_unique = true的行,仅该行保留原value,同车辆其他债务行的value设为0.0 - 若不存在
fl_unique = true的行,所有债务行保留原value
解决方案1:使用EXISTS子查询
SELECT c.id AS car_id, c.brand, c.owner_id, cd.id AS debt_id, CASE -- 判断当前车辆是否存在fl_unique=true的债务行 WHEN EXISTS ( SELECT 1 FROM car_debts cd2 WHERE cd2.car_id = cd.car_id AND cd2.fl_unique = true ) THEN -- 仅fl_unique=true的行保留原值,其余设为0.0 IF(cd.fl_unique = true, cd.value, 0.0) -- 无特殊债务行时保留所有原值 ELSE cd.value END AS processed_value, cd.fl_unique FROM cars c INNER JOIN car_debts cd ON c.id = cd.car_id;
解决方案2:使用窗口函数(更高效)
通过窗口函数提前标记每个车辆是否存在特殊债务行,避免重复子查询:
SELECT c.id AS car_id, c.brand, c.owner_id, cd.id AS debt_id, CASE WHEN cd.has_unique = 1 THEN IF(cd.fl_unique = true, cd.value, 0.0) ELSE cd.value END AS processed_value, cd.fl_unique FROM cars c INNER JOIN ( SELECT *, -- 标记当前车辆是否存在fl_unique=true的行(1=存在,0=不存在) MAX(CASE WHEN fl_unique = true THEN 1 ELSE 0 END) OVER (PARTITION BY car_id) AS has_unique FROM car_debts ) cd ON c.id = cd.car_id;
补充说明
- 如果需要查询特定车辆,可在语句末尾添加
WHERE c.id = [目标车辆ID]进行过滤 - 若
value字段可能为NULL,可将cd.value替换为COALESCE(cd.value, 0.0),确保结果始终为数值类型 - 两种方案都支持
LEFT JOIN,如果需要包含无债务记录的车辆,只需将INNER JOIN改为LEFT JOIN,并处理processed_value的NULL情况
内容的提问来源于stack exchange,提问作者jampzs
相关产品推荐
相关产品推荐

