如何在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;
代码解释
- 子查询中的窗口函数:
ROW_NUMBER() OVER(PARTITION BY table1.ID ORDER BY table2.Type)会把相同ID的行归为一组,每组内按Type字段排序,然后给每行分配一个从1开始的序号。 - 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
相关产品推荐
相关产品推荐

