Oracle SQL去重需求:优先用car_col数据,无则取car_cat
解决Oracle SQL优先匹配domain并去重的问题
你的需求是优先使用reference_codes表中domain='car_col'的描述信息,当该domain无对应code时再使用domain='car_cat'的,同时要避免结果出现重复行。当前SQL因关联两个domain的所有匹配项导致重复,以下是两种可行的解决方案:
方法一:使用窗口函数ROW_NUMBER()
通过窗口函数给不同domain的匹配项分配优先级,只保留最高优先级的记录:
SELECT customer_id, car_code, code_desc, price FROM ( SELECT a.customer_id, a.car_code, b.description AS code_desc, a.price, -- 为car_col的记录设置最高优先级(行号1),car_cat为次优先级(行号2) ROW_NUMBER() OVER (PARTITION BY a.customer_id, a.car_code ORDER BY CASE b.domain WHEN 'car_col' THEN 1 ELSE 2 END) AS rn FROM product a LEFT JOIN reference_codes b ON a.car_code = b.code AND b.domain IN ('car_col', 'car_cat') ) t WHERE rn = 1; -- 仅保留每个(customer_id, car_code)组合中优先级最高的记录
方法二:使用COALESCE结合子查询
直接在SELECT语句中优先获取car_col的描述,无匹配时 fallback 到car_cat:
SELECT a.customer_id, a.car_code, -- 优先返回car_col的描述,无匹配则返回car_cat的描述 COALESCE( (SELECT description FROM reference_codes WHERE domain = 'car_col' AND code = a.car_code), (SELECT description FROM reference_codes WHERE domain = 'car_cat' AND code = a.car_code) ) AS code_desc, a.price FROM product a;
内容的提问来源于stack exchange,提问作者Lizzie
相关产品推荐
相关产品推荐

