Oracle获取列值唯一结果集方法咨询及SQL查询协助请求
Rajendra你好!咱们来逐个解决你的两个Oracle问题:
1. 如何在Oracle数据库中获取结果集中列值唯一的记录?
根据你的具体需求,有几种常用的实现方式:
- 使用
DISTINCT关键字:如果要去除结果集中完全重复的行(所有列值都相同的行),直接在SELECT后添加DISTINCT即可:SELECT DISTINCT 列1, 列2, ... FROM 你的表名; - 按目标列分组(
GROUP BY):如果只需要某一列的值唯一,同时要获取其他列的聚合结果(比如最大值、最小值),可以用GROUP BY:SELECT 唯一列, MAX(其他列) AS 最新值 FROM 你的表名 GROUP BY 唯一列; - 使用窗口函数
ROW_NUMBER():如果需要为每个唯一列值保留特定的一行(比如最新的记录),窗口函数可以帮你精准筛选:
这里SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY 唯一列 ORDER BY 日期列 DESC) rn FROM 你的表名 t ) WHERE rn = 1;PARTITION BY指定需要唯一的列,ORDER BY决定每个分组中保留哪一行(示例中按日期倒序取最新的记录)。
2. 优化你的SQL查询
你的原始查询关联了LineGernal和BaseAddOns表,但存在一个小问题:两个表都有Id列,查询结果中会出现列名重复的情况。咱们先给列和表加别名来解决这个问题,同时根据常见需求提供几种优化方案:
基础优化版(列名清晰无歧义)
SELECT lg.Id AS LineGernal_ID, lg.Description, lg.SSMS, bao.Id AS BaseAddOns_ID FROM LineGernal lg INNER JOIN BaseAddOns bao ON lg.Id = bao.ParentLineGernalID
给表加别名(lg代表LineGernal,bao代表BaseAddOns)让查询更简洁,重命名Id列避免结果集中的列名混淆。
如果需要每个LineGernal只对应一条BaseAddOns记录
如果一个LineGernal记录关联了多条BaseAddOns记录,而你只想保留每组的一条匹配结果,可以结合问题1中的窗口函数:
SELECT LineGernal_ID, Description, SSMS, BaseAddOns_ID FROM ( SELECT lg.Id AS LineGernal_ID, lg.Description, lg.SSMS, bao.Id AS BaseAddOns_ID, ROW_NUMBER() OVER (PARTITION BY lg.Id ORDER BY bao.Id) rn FROM LineGernal lg INNER JOIN BaseAddOns bao ON lg.Id = bao.ParentLineGernalID ) WHERE rn = 1;
这个查询会为每个LineGernal保留第一条关联的BaseAddOns记录(按BaseAddOns.Id排序)。
如果需要去除结果集中的重复行
如果关联后的结果存在完全重复的行,可以添加DISTINCT去重:
SELECT DISTINCT lg.Id AS LineGernal_ID, lg.Description, lg.SSMS, bao.Id AS BaseAddOns_ID FROM LineGernal lg INNER JOIN BaseAddOns bao ON lg.Id = bao.ParentLineGernalID
内容的提问来源于stack exchange,提问作者user3777918
相关产品推荐
相关产品推荐

