Oracle 12c关联条件仅当vehicle_given为YES时比对vehicle_id的实现
解决方案
你现有代码存在两处需要修正的问题:
- 第二个子查询d2中存在重复的
FROM语句,属于语法错误,需要先删除多余的FROM段 - 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
相关产品推荐
相关产品推荐

