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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:01:55