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

Oracle 12c关联条件仅当vehicle_given为YES时比对vehicle_id的实现

解决方案

你现有代码存在两处需要修正的问题:

  1. 第二个子查询d2中存在重复的FROM语句,属于语法错误,需要先删除多余的FROM段
  2. CASE表达式不能直接返回布尔判断结果作为连接条件,写法不符合SQL规范

最优实现方案

用逻辑判断代替CASE表达式,将原CASE对应的连接条件替换为如下逻辑:

(d1.vehicle_given <> 'YES' OR d1.vehicle_id = d2.vehicle_id)

该逻辑完全匹配你的需求:

  • 当d1.vehicle_given的值不为YES时,d1.vehicle_given <> 'YES'条件成立,整段判断结果为真,不会校验两个表的vehicle_id是否相等
  • 当d1.vehicle_given的值为YES时,d1.vehicle_given <> 'YES'不成立,必须满足d1.vehicle_id = d2.vehicle_id,整段判断才会为真,才会匹配对应记录

如果d1.vehicle_given可能存在NULL值,可以补充空值判断让逻辑更严谨:

(d1.vehicle_given IS NULL OR d1.vehicle_given <> 'YES' OR d1.vehicle_id = d2.vehicle_id)

修正后的完整SQL

SELECT * FROM 
   (SELECT d.value, d.line, d.language, l.pos_id, l.vehicle_id,l.vehicle_given
    FROM Vehicle_value d,
    vehicle_document l
    WHERE d.gen_id = l.gen_id
    AND d.pos_id = l.pos_id
    AND d.gen_id = 1255) d1
    LEFT OUTER JOIN
    -- 已删除d2子查询中重复的FROM语句
    (SELECT d.value, d.line, d.language, l.pos_id, l.vehicle_id,l.vehicle_given
    FROM TBB_GEN_Daten d,
    TBB_GEN_Lesehilfe l
    WHERE d.gen_id = l.gen_id
    AND d.pos_id = l.pos_id
    AND d.gen_id = 1254) d2
    ON d1.value = d2.value
    AND d1.pos_id = d2.pos_id
    -- 替换原CASE语句为逻辑判断
    AND (d1.vehicle_given <> 'YES' OR d1.vehicle_id = d2.vehicle_id)
    AND d1.value is not null;

可选的CASE写法(不推荐,不如逻辑判断简洁)

如果你一定要使用CASE表达式实现,可以修改为返回值匹配的写法:

AND CASE 
    WHEN d1.vehicle_given = 'YES' AND d1.vehicle_id = d2.vehicle_id THEN 1
    WHEN d1.vehicle_given <> 'YES' THEN 1
    ELSE 0 
END = 1

内容的提问来源于stack exchange,提问作者Sangathamilan Ravichandran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:09:01