"Oracle 中的 ROWNUM 和 DISTINCT" Oracle 中的 ROWNUM 和 DISTINCT 是两个非常重要的关键词,它们在查询数据时发挥着至关重要的作用。然而,许多开发者在使用这两个关键词时,却常常会遇到一些不太理解的地方,例如,当 DISTINCT 和 ROWNUM 一起使用时,为什么不能得到预期的结果?下面我们将详细地解释 ROWNUM 和 DISTINCT 的工作原理,并分析为什么它们在一起使用时会出现一些问题。 lets' talk about ROWNUM。ROWNUM 是 Oracle 系统赋予查询返回的行的编号,它是从 1 开始的,这个伪字段可以用于限制查询返回的总行数。但是,ROWNUM 的真正含义往往被人误解。很多人认为 ROWNUM 是在查询结果集整个返回后再分配的顺序编号,但实际上 ROWNUM 是在 Oracle 系统顺序分配的,从查询返回的第一行分配的是 1,第二行是 2,依此类推。这样,ROWNUM 可以用于限制查询返回的总行数。 让我们来探讨 DISTINCT 的工作原理。DISTINCT 是等记录集全部查询出后,然后进行排序,最后再删除重复数据,而不是边查边删除重复数据。很多人认为 DISTINCT 是边查边删除重复数据的,但实际上不是这样。DISTINCT 只有在查询结果集返回后才开始工作。 现在,让我们来分析为什么当 DISTINCT 和 ROWNUM 一起使用时,不能得到预期的结果。例如,我们可以使用以下 SQL 语句: SELECT DISTINCT a.access_id, a.link_id FROM asn_access a, asn_res_link b WHERE a.access_id = '000000000000000000035696' AND a.link_id = b.link_id AND a.delete_state = '0' AND b.delete_state = '0' AND rownum < 3 这个 SQL 语句的结果可能不是我们预期的结果。为什么呢?因为 ROWNUM 首先对查询出来的记录进行标号,然后 DISTINCT 再开始工作,删除重复数据。所以,只有第一条记录满足 ROWNUM < 3 的条件,其他记录都被删除了。 那么,如何才能得到预期的结果呢?我们可以使用子查询的方式,先使用 DISTINCT 返回结果,然后再使用 ROWNUM 限制结果: SELECT c.access_id, c.link_id FROM ( SELECT DISTINCT a.access_id, a.link_id FROM asn_access a, asn_res_link b WHERE a.access_id = '000000000000000000035696' AND a.link_id = b.link_id AND a.delete_state = '0' AND b.delete_state = '0') c WHERE rownum < 3 这样,我们就可以得到预期的结果了。 ROWNUM 和 DISTINCT 是两个非常重要的关键词,但它们的工作原理却非常不同。只有当我们正确理解它们的工作原理时,才能正确地使用它们,避免一些不必要的错误。
- 粉丝: 11
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 建筑工程消防验收现场评定表.docx
- 交叉检查记录表(急救分中心).doc
- 交叉检查记录表(社区服务中心和乡镇卫生院).doc
- 居家适老化改造补贴实施细则产品功能表.docx
- 井田勘探探矿权出让收益评估报告( 模板).doc
- 髋关节功能丧失程度评定表.docx
- 买断式回购应急确认对话报价申请单.docx
- 每月质量安全调度会议纪要.docx
- 每月电梯安全调度会议纪要.docx
- 每周电梯质量安全排查报告.docx
- 每周电梯安全排查报告.docx
- 每月质量安全调度会议纪要表.docx
- 排水管网情况表.docx
- 聘请服务审批表(表格模板).docx
- 培训班次计划表.doc
- 密闭式输液表格、注意事项.docx