热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库技术:oracle实现一对多数据分页查询筛选示例代码

前言今天项目测试运行的时候,遇到了一个奇怪的问题,这个问题说起来按sql语法的话是没有错误的但是呢按照我们的业务来做区分就有些逻辑上的错误了

前言

今天项目测试运行的时候,遇到了一个奇怪的问题,这个问题说起来按sql语法的话是没有错误的

但是呢按照我们的业务来做区分就有些逻辑上的错误了,

下面请听我慢慢道来,在数据库中有两个数据,

先来看下第一次sql是如何写的

查询之后在外面做分页,很正常的逻辑,但是大家都发现了,这是一个多表查询,而且是一对多关系,这就有点问题了

先来看一个图

oracle实现一对多数据分页查询筛选示例代码 

问题出现在哪呢?

1、需要对主表做分页数据查询,  如:

    limit 1,10 select * from (select a.* ,rownum r from (select _ from car) a where rownum <= ${limitend} ) b where r >= ${limitstart} ]

以上是对上表做数据统计,然后分页,

2、根据传入字段做筛选,如:车辆的座位数,排量,

出现的问题

因为业务数据庞大,一对多关系数据冗余,出现数据偏移

主要解决思路如下

嗯,下来个图示吧

oracle实现一对多数据分页查询筛选示例代码 

1、对子表合并,做行转列, 2、在主表做分页筛选时就不会出现,因为一对多关系数据冗余,出现数据偏移

  select * from (select a.* ,rownum r from (        select      t_car."id" as car_id , t_car."car_name" as car_car_name , t_car."vin_number"      as car_vin_number ,car_label.label_ids     from t_car      left join (select car_id,wm_concat(lable_id) as label_ids from t_car_label group by car_id) car_label on car_label.car_id = t_car.id      where find_in_set('4aa06d2b9e904fe8bfeba3505c5dad6a',label_ids)=1    ) a where rownum <=10 ) b where r >=

find_in_set:由于写在sql里的筛选很繁琐,此方法是一个储存函数 这个实现不是很好

此函数在mysql下有定义,但是此处因为与业务相关,内部做了一些更改

具体修改是当传进了一个{1,2,3,4}格式的数据时也可以做出条件筛选

  create or replace function find_in_set(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',')  return number is    l_idx_a number:=0; -- 用于计算piv_str1中分隔符的位置   l_idx_b number:=0; -- 用于计算piv_str2中分隔符的位置   str_a  varchar2(4000); -- 根据分隔符截取的子字符串   str_b  varchar2(4000); -- 根据分隔符截取的子字符串   piv_str_a varchar2(4000) := piv_str1; -- 将piv_str1赋值给piv_str_a   piv_str_b varchar2(4000) := piv_str2; -- 将piv_str2赋值给piv_str_b   res  number:=0; -- 返回结果  begin  -- 如果piv_str_a中没有分割符,直接循环判断piv_str_a和piv_str_b是否相等,相等 res=1  if instr(piv_str_a, p_sep, 1) = 0 then   -- 如果piv_str2中没有分割符,直接判断piv_str1和piv_str2是否相等,相等 res=1     if instr(piv_str_b, p_sep, 1) = 0 then      if piv_str_a = piv_str_b then       res:= 1;      end if;     else     -- 循环按分隔符截取piv_str_b     loop      l_idx_b := instr(piv_str_b,p_sep);     -- 当piv_str中还有分隔符时       if l_idx_b > 0 then      -- 截取第一个分隔符前的字段str        str_a:= substr(piv_str_b,1,l_idx_b-1);      -- 判断 str 和piv_str_a 是否相等,相等 res=1 并结束循环判断        if str_a = piv_str_a then        res:= 1;        exit;        end if;       piv_str_b := substr(piv_str_b,l_idx_b+length(p_sep));       else      -- 当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等 res=1       if piv_str_a = piv_str_b then        res:= 1;       end if;       -- 无论最后是否相等,都跳出循环       exit;       end if;     end loop;     -- 结束循环     end if;  else  -- 循环按分隔符截取piv_str_a  loop   l_idx_a := instr(piv_str_a,p_sep);  -- 当piv_str_a中还有分隔符时    if l_idx_a > 0 then   -- 截取第一个分隔符前的字段str     str_a:= substr(piv_str_a,1,l_idx_a-1);     -- 如果piv_str_b中没有分割符,直接判断piv_str1和piv_str是否相等,相等 res=1     if instr(piv_str_b, p_sep, 1) = 0 then      -- 判断 str_a 和piv_str_b 是否相等,相等 res=1 并结束循环判断        if str_a = piv_str_b then        res:= 1;        exit;        end if;     else     -- 循环按分隔符截取piv_str_b     loop      l_idx_b := instr(piv_str_b,p_sep);     -- 当piv_str中还有分隔符时       if l_idx_b > 0 then      -- 截取第一个分隔符前的字段str        str_b:= substr(piv_str_b,1,l_idx_b-1);      -- 判断 str 和piv_str1 是否相等,相等 res=1 并结束循环判断        if str_b = str_a then        res:= 1;        exit;        end if;       piv_str_b := substr(piv_str_b,l_idx_b+length(p_sep));       else      -- 当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等 res=1       if piv_str_a = piv_str_b then        res:= 1;       end if;       -- 无论最后是否相等,都跳出循环       exit;       end if;     end loop;     -- 结束循环     end if;    piv_str_a := substr(piv_str_a,l_idx_a+length(p_sep));    else   -- 当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等 res=1    if piv_str_a = piv_str_b then     res:= 1;    end if;    -- 无论最后是否相等,都跳出循环    exit;    end if;  end loop;  -- 结束循环  end if;  -- 返回res  return res;  end find_in_set;

然后完美解决

总结

以上就是这篇文章的全部内容了,希望数据库技术:oracle实现一对多数据分页查询筛选示例代码的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对<编程笔记>的支持。

需要了解更多数据库技术:oracle实现一对多数据分页查询筛选示例代码,都可以关注数据库技术分享栏目—编程笔记


推荐阅读
  • 包含phppdoerrorcode的词条 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 在什么情况下MySQL的可重复读隔离级别会导致幻读现象? ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • SQL 连接详解与应用
    本文详细介绍了 SQL 连接的概念、分类及实际应用,包括内连接、外连接、自连接等,并提供了丰富的示例代码。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 在使用达梦数据库时,管理员可能会遇到连接频繁中断或特定SQL语句语法错误的问题。这些问题通常源于开发人员在创建对象时的不规范操作。为了解决这些问题,建议对数据库配置进行优化,并确保所有SQL语句符合达梦数据库的标准语法。此外,定期检查和维护数据库连接参数,以及对异常日志进行详细分析,也有助于及时发现并解决问题。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 本文深入探讨了Hibernate框架中乐观锁和悲观锁的机制及其多态特性。乐观锁假设数据在大多数情况下不会发生冲突,因此在读取数据时不加锁,而是在更新时检查版本号以确保数据未被修改。相比之下,悲观锁则认为数据在并发环境下容易产生冲突,因此在读取数据时立即加锁,以防止其他事务访问同一数据,从而避免潜在的数据不一致问题。文章还详细分析了这两种锁机制在实际应用中的优缺点,并介绍了Hibernate中的多态特性如何与锁机制结合,以实现更高效的数据管理和并发控制。 ... [详细]
author-avatar
郭原雪2865
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有