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

如何在Oracle SQL内连接表中实现指定去重样式输出

解决Oracle SQL中内连接后同一ID重复显示Value的问题

我明白你的需求——内连接后同一ID的Value字段只在第一行显示,后续行用'-'替代,而不是重复显示。在Oracle里,用**窗口函数ROW_NUMBER()**就能完美实现这个效果,不用复杂的分组或者统计操作。

具体解决方案

核心思路是给每个ID分组内的行标记序号,然后通过CASE语句判断序号是否为1,来决定显示原始Value还是'-':

SELECT 
    table1.ID, 
    table2.TYPE, 
    CASE 
        WHEN rn = 1 THEN TO_CHAR(table1.value)  -- 转成字符串统一类型,避免类型不匹配
        ELSE '-' 
    END AS Value, 
    table2.other
FROM (
    SELECT 
        table1.ID, 
        table1.value, 
        table2.TYPE, 
        table2.other,
        -- 按ID分组,给每个分组内的行按Type排序并编号
        ROW_NUMBER() OVER(PARTITION BY table1.ID ORDER BY table2.Type) AS rn
    FROM table1 
    INNER JOIN table2 ON table1.ID = table2.ID
) t;

代码解释

  1. 子查询中的窗口函数:ROW_NUMBER() OVER(PARTITION BY table1.ID ORDER BY table2.Type)会把相同ID的行归为一组,每组内按Type字段排序,然后给每行分配一个从1开始的序号。
  2. CASE语句处理Value字段:当序号rn=1时(也就是每个ID的第一行),显示原始的value(这里用TO_CHAR()转成字符串,因为'-'是字符串,要保证列类型统一);否则显示'-'。

执行结果

运行上面的SQL后,就能得到你期望的结果:

+-----------+-----------+---------+------------------+
| ID        | Type      | Value   | other            |
+-----------+-----------+---------+------------------+
| 123456    | 00        | 5       | 2                |
| 123456    | 01        | -       | 6                |
| 123456    | 02        | -       | 4                |
| 987654    | 00        | 7       | 7                |
| 987654    | 01        | -       | 8                |
| 456789    | 00        | 6       | 6                |
| 456789    | 01        | -       | 16               |
+-----------+-----------+---------+------------------+

注意事项

  • 如果你的Type字段没有明确的排序规则,可以根据实际需求调整ORDER BY的字段(比如table2.other或者其他字段),只要保证每个ID组内第一行是你想要显示Value的那行就行。
  • 因为Value字段原本是数值型,而'-'是字符串,所以用TO_CHAR()把数值转成字符串,避免Oracle抛出类型不匹配的错误。

内容的提问来源于stack exchange,提问作者M.Wagner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:59:53