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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:42:33