热门标签 | 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实现一对多数据分页查询筛选示例代码,都可以关注数据库技术分享栏目—编程笔记


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
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社区 版权所有