Oracle根据多列去重

(1)distinct

关键词 distinct用于返回唯一不同的值,可作用于单列和多列

但必须将其放在开头,否则会提示错误
Oracle根据多列去重_第1张图片
而若在其后添加多个变量名,则返回的将是这多个变量名不同时重复的列,因而使用distinct筛选某字段不重复记录时无法同时得到其他的信息。

此时可以采用group by函数

(2)group by

与聚合函数联用可以在取多个字段的同时去重其中一个字段

例如要显示的字段为A、B、C三个,而A字段的内容不能重复,可以如下语句:

select A, max(B), max(C), count(*) 重复次数 from [table] 
where [条件] group by A having count(*) >= (int n);

如果在上句中having加 count()>1,就可以查出记录A所有有重复的记录;

count()>=1 就可以查出所有的记录,但重复的只显示一条,并且后面有显示重复的次数。

推荐使用:

SELECT * FROM t1  WHERE ROWID IN (SELECT MAX(ROWID) FROM t1 GROUP BY id, name;

上式可以对拥有相同id和name的数据进行去重。

ROWID是ORACLE中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。

ROWID是一个伪列,并不实际存在于表中。它是ORACLE在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列。所以根据一行数据的ROWID能找到一行数据的物理地址信息。从而快速地定位到数据行。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。

ROWID采用64进制编码:A ~ Z表示0到25;a ~ z表示26到51;0 ~ 9表示52到61;+表示62;/ 表示63;一共64个字符。

查看ROWID:

SELECT A.*, ''||A.ROWID FROM STUINFO A;

在这里插入图片描述
表格数据的构建见文章末尾

将同班、同名的信息进行去重:

SELECT * FROM STUINFO WHERE ROWID IN (SELECT MIN(ROWID) FROM STUINFO WHERE CLASSNO IS NOT NULL
GROUP BY STUID, STUNAME )  ORDER BY STUID;

Oracle根据多列去重_第2张图片

你可能感兴趣的:(oracle使用记录)