Oracle SQL中如何优先选指定类型记录,无则选另一类型?
解决方案
针对你的需求,在Oracle中可以通过两种常用方法实现,以下是具体实现方式:
方法一:使用窗口函数(推荐)
利用ROW_NUMBER()窗口函数按ID分组,给每个ID下的记录按优先级排序(A优先于B),然后筛选每组的第一条记录。这种方法简洁高效,尤其适合包含多列的结果集:
-- 先将你的多表复杂查询定义为临时结果集 WITH temp_data AS ( -- 替换为你的实际多表复杂查询语句,需包含WHERE type IN ('A','B') SELECT ID, code, type FROM your_source_tables WHERE type IN ('A','B') -- 此处添加你的多表关联、过滤等复杂条件 ) SELECT ID, code, type FROM ( SELECT ID, code, type, -- 按ID分组,type=A的记录排第1位,B排第2位 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CASE WHEN type = 'A' THEN 1 ELSE 2 END) AS row_num FROM temp_data ) t WHERE row_num = 1;
逻辑说明
PARTITION BY ID:将结果按ID分组,确保每个ID单独处理ORDER BY CASE:给type=A的记录分配更高优先级(行号1),B类为行号2- 筛选
row_num=1:保留每个ID下优先级最高的记录
方法二:使用UNION ALL分两次查询
先提取所有存在type=A的ID对应的A记录,再提取仅存在type=B的ID对应的B记录,通过UNION ALL合并结果:
WITH temp_data AS ( -- 替换为你的实际多表复杂查询语句 SELECT ID, code, type FROM your_source_tables WHERE type IN ('A','B') ) -- 第一步:取所有有A类记录的ID对应的A记录 SELECT ID, code, type FROM temp_data WHERE type = 'A' UNION ALL -- 第二步:取没有A类记录的ID对应的B记录 SELECT ID, code, type FROM temp_data WHERE type = 'B' AND ID NOT IN (SELECT DISTINCT ID FROM temp_data WHERE type = 'A');
逻辑说明
- 第一部分直接筛选所有type=A的记录,覆盖所有存在A类的ID
- 第二部分通过子查询排除已存在A类的ID,仅保留只有B类的ID对应的记录
内容的提问来源于stack exchange,提问作者Sudipta Biswas
相关产品推荐
相关产品推荐

