Oracle数据库:删除重复记录与查询已借出图书实战

3星 · 超过75%的资源 需积分: 9 21 下载量 39 浏览量 更新于2024-09-12 收藏 66KB PDF 举报
"Oracle复杂查询练习题用于提升初学者对Oracle查询的理解,涉及删除重复记录和获取当前已借出图书信息的SQL语句。" 在Oracle数据库管理中,查询是核心技能之一,对于初学者来说,通过练习可以快速掌握相关知识。本练习题提供了两个示例,分别涉及到删除重复记录和查询特定状态的图书信息。 首先,让我们来看看如何在没有主键的情况下删除重复记录。在示例中,创建了一个名为TESTTB的表,其中包含两个字段:BM和MC,且插入了重复数据。删除重复记录有两种方法: 1. 方案一:通过ROWID与GROUP BY结合的方式,保留每个分组中的最大ROWID(即最新的一条记录),然后删除其他ROWID。这是通过子查询实现的,子查询首先找到每个分组的最大ROWID,然后在外部删除语句中排除这些ROWID。 ```sql delete from TESTTB where rowid not in (select max(rowid) from TESTTB group by TESTTB.BM, TESTTB.MC) ``` 2. 方案二:使用自连接来实现,将原表与自身进行连接,比较当前ROWID是否为同一分组内的最大ROWID,如果不是,则删除该记录。 ```sql delete from TESTTB a where a.rowid != (select max(rowid) from TESTTB b where a.bm = b.bm and a.mc = b.mc) ``` 这两种方法都能达到删除重复记录的效果,但在实际应用中需要根据具体情况选择更适合的策略。 接下来,我们关注第二个问题,如何获取现在状态为已借出的所有图书的相关信息,同时排除ID为3的已归还的'JAVA'书。这里有两个表,book存储图书基本信息,bookEnrol记录图书的借阅信息,包括bookId、借阅日期和状态。要查询已借出的图书,我们需要找到状态为1的记录,并排除ID为3的图书。 ```sql select b.id, b.name, be.dependDate from book b join bookEnrol be on b.id = be.bookId where be.state = 1 and b.id != 3 ``` 这个SQL语句会返回所有已借出图书的ID、名称以及借阅日期,但不包括ID为3的'JAVA'书。 通过这些练习,初学者可以加深对Oracle SQL查询的理解,包括子查询、聚合函数、连接操作以及条件过滤等概念,从而提升在实际工作中的查询能力。