使用oracle怎么实现一对多数据分页查询筛选

  介绍

使用oracle怎么实现一对多数据分页查询筛选?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

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

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

<强>先来看一个图

使用oracle怎么实现一对多数据分页查询筛选”>,</p> <p> <强>问题出现在哪呢? </强> </p> <p> 1,需要对主表做分页数据查询,如:</p> <p> <代码>限制1,10 </代码>或<代码> SELECT * FROM(选择一个。*,ROWNUM R从(从汽车选择_)ROWNUM & lt;=$ {limitEnd}) B R祝辞=$ {limitStart}] </代码> </p> <p>以上是对上表做数据统计,然后分页,</p> <p> 2,根据传入字段做筛选,如:车辆的座位数,排量,</p> <p> <强>出现的问题</强> </p> <p>因为业务数据庞大,一对多关系数据冗余,出现数据偏移</p> <p>主要解决思路如下</p> <p>嗯,下来个图示吧</p> <p> <img src= SELECT  *,得到(SELECT  A *, ROWNUM  R 得到(   ,   ,才能选择   ,,,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   ,才能得到T_CAR   ,,,left  join  (select 赛车wm_concat (LABLE_ID), as  label_ids 得到T_Car_label  group  by 用时),car_label 提醒car_label.CAR_ID =T_CAR.ID   ,,,where  FIND_IN_SET (& # 39; 4 aa06d2b9e904fe8bfeba3505c5dad6a& # 39; label_ids)=1   ),才能A  WHERE  ROWNUM  & lt;=10,), B  WHERE  R 祝辞=

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

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

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

create 或是replace  FUNCTION  FIND_IN_SET (piv_str1  varchar2, piv_str2  varchar2,, p_sep  varchar2 :=, & # 39;, & # 39;)   RETURN  NUMBER  IS    ,l_idx_a 数量:=0;,,,用于计算piv_str1中分隔符的位置   ,l_idx_b 数量:=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 数字:=0;,,,返回结果   开始   ——,如果piv_str_a中没有分割符,直接循环判断piv_str_a和piv_str_b是否相等,相等,res=1   IF  instr (piv_str_a, p_sep,, 1),=0,那么   ,——如果piv_str2中没有分割符,直接判断piv_str1和piv_str2是否相等,相等,res=1   ,,IF  instr (p_sep piv_str_b也,,,=0,那么   ,,,IF  piv_str_a =piv_str_b 然后   ,,,,res:=, 1;   ,,,最终获得;如果;   其他的,,   ,,,,循环按分隔符截取piv_str_b   ,,循环   ,,,l_idx_b :=, instr (piv_str_b p_sep);   ,,,,当piv_str中还有分隔符时   ,,,,IF  l_idx_b 在0,那么   ,,,,,截取第一个分隔符前的字段str   ,,,,,str_a:=, substr (piv_str_b 1 l_idx_b-1);   ,,,,,判断,str 和piv_str_a 是否相等,相等,res=1,并结束循环判断   ,,,,,IF  str_a =piv_str_a 然后   ,,,,,res:=, 1;   ,,,,,退出;   ,,,,,最终获得;如果;   ,,,,piv_str_b :=, substr (piv_str_b l_idx_b +长度(p_sep));   ,,,,   ,,,,,当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等,res=1   ,,,,IF  piv_str_a =piv_str_b 然后   ,,,,,res:=, 1;   ,,,,最终获得;如果;   ,,,,,,无论最后是否相等,都跳出循环   ,,,,退出;   ,,,,最终获得;如果;   ,才能最终获得;循环;   ,,,,结束循环   ,才能最终获得;如果;   其他的   ——,循环按分隔符截取piv_str_a   循环   ,l_idx_a :=, instr (piv_str_a p_sep);   ——,当piv_str_a中还有分隔符时   IF 才能;l_idx_a 祝辞0,那么   ,——截取第一个分隔符前的字段str   ,,str_a:=, substr (piv_str_a 1 l_idx_a-1);   ,,,,如果piv_str_b中没有分割符,直接判断piv_str1和piv_str是否相等,相等,res=1   ,,IF  instr (p_sep piv_str_b也,,,=0,那么   ,,,,,判断,str_a 和piv_str_b 是否相等,相等,res=1,并结束循环判断   ,,,,,IF  str_a =piv_str_b 然后   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

使用oracle怎么实现一对多数据分页查询筛选