暂无图片
学生基础数据表未创建学号列的唯一索引或主键,一次导入误操作导致学号和姓名出现重复数据,亟需进行数据治理。如下哪几SQL可输出全部重复多余的学生信息?
我来答
分享
孙希瑞
2024-01-17
学生基础数据表未创建学号列的唯一索引或主键,一次导入误操作导致学号和姓名出现重复数据,亟需进行数据治理。如下哪几SQL可输出全部重复多余的学生信息?

学号列为SNO,姓名列为STUDENT_NAME.
A、SELECT SNO,STUDENT_NAME FROM (SELECT DENSE_RANK() OVER(ORDER BY SNO) ROW_SNO,SNO,STUDENT_NAME FROM T_STUDENTS) WHERE ROW_SNO>1;
B、SELECT SNO,STUDENT_NAME FROM T_STUDENTS WHERE ROWID IN (SELECT ROWID FROM T_STUDENTS MINUS SELECT MAX(ROWID) FROM T_STUDENTS GROUP BY SNO);
C、SELECT SNO,STUDENT_NAME FROM (SELECT ROW_NUMBER() OVER(PARTITION BY SNO ORDER BY ROWID) ROW_SNO,SNO,STUDENT_NAME FROM T_STUDENTS) WHERE ROW_SNO>1;
D、SELECT SNO,STUDENT_NAME FROM T_STUDENTS MINUS SELECT -1 SNO,‘NULL’ STUDENT_NAME FROM DUAL;
E、SELECT SNO,STUDENT_NAME FROM T_STUDENTS WHERE (SNO,ROWID) IN (SELECT SNO,MAX(ROWID) FROM T_STUDENTS GROUP BY SNO);

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
浮光墨影

选择:A,C;

A选项使用窗口函数DENSE_RANK()给每个学号分配一个行序列号(ROW_SNO),当同一个学号有多个记录时,这些记录会获得相同的行序列号。然后查询筛选出序列号大于1的记录,即那些有重复学号的记录。
C选项使用ROW_NUMBER()函数,通过学号分组并按行ID排序,为每个学号内的记录分配一个行号(ROW_SNO)。当同一个学号有多个记录时,这些记录会获得相同的行号。然后查询筛选出行号大于1的记录,即那些有重复学号的记录。
B选项尝试通过行ID来识别重复记录,但它使用的是MINUS操作符,这个操作符是用来从左表中排除与右表匹配的行。在这个查询中,它从所有学生的行ID中排除掉每个学号的最大行ID,理论上会剩下重复的行ID,但是这种方法并不总是可靠,因为如果行ID不是唯一的或者有其他问题,它就不能正确识别重复项。
D选项实际上并不会返回任何结果,因为它试图选择一个不存在的学号(-1),并且将学生姓名设置为NULL,这并不是一个有效的解决方案来识别重复数据。

暂无图片 评论
暂无图片 有用 13
暂无图片
Thomas

A不对,没有加over()里没有PARTITION BY SNO,如何能针对同一学号输出不同的row_sno?

B可以

C可以

D不知所云,不对

E 对SNO进行DISTINCT再输出,并不能彰显出哪些SNO是有重复记录的,不对 

暂无图片 评论
暂无图片 有用 1
广州_老虎刘
2024-01-19
这位同学给出的答案是对的. a不但是没有partition by的问题, 而且dense_rank也不可能得到想要的结果
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏