oracle 一对多数据分页查询筛选-程序员宅基地

技术标签: 数据库  大数据  

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

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

 

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

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

 

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

先来看一个图

 

 

问题出现在哪呢?

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

    limit 1,10 或 SELECT * FROM (SELECT A.* ,ROWNUM R FROM (select _ from car) A WHERE ROWNUM <= ${limitEnd} ) B WHERE R >= ${limitStart} ]

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

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

 

出现的问题

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

 

主要解决思路如下

嗯,下来个图示吧

 

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;

  

然后完美解决

 

转载于:https://www.cnblogs.com/dmeck/p/9771779.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33854644/article/details/93160740

智能推荐

本周六与您相约 | 计算未来轻沙龙:让机器拥有理解语言的能力-程序员宅基地

文章浏览阅读477次。国庆长假转眼就过去了你是不是死活找不回学习状态?惊闻!有人在你畅饮肥宅快乐水之际已经默默投出了又一篇论文……短短短的假期,也在不停赋能充电怎么样,是不是有点心慌?要是还不..._王炳宁 中科院自动化所

【华为OD机试 2023 B卷 | 200分】We Are A Team(C++ Java JavaScript Python)_华为od we are a team-程序员宅基地

文章浏览阅读9.6k次。总共有 n 个人在机房,每个人有一个标号(1_华为od we are a team

常见文件格式的文件头数值-程序员宅基地

文章浏览阅读390次。常见文件格式的文件头数值JPEG (jpg),文件头:FFD8FFPNG (png),文件头:89504E47GIF (gif),文件头:47494638TIFF (tif),文件头:49492A00Windows Bitmap (bmp),文件头:424DCAD (dwg),文件头:41433130Adobe Photoshop (psd),文件头:38425053..._常见文件格式的文件头数值

安装leach-234,./configure出现‘Installation of tcl seems incomplete or can't be found automaticall'怎么办_configure: error: installation of tcl seems incomp-程序员宅基地

文章浏览阅读1.5k次。# ./configurechecking for gcc... gccchecking whether the C compiler works... yeschecking for C compiler default output file name... a.outchecking for suffix of executables... checking whether we are c..._configure: error: installation of tcl seems incomplete or can't be found aut

解决Could not resolve com.github.tbruyelle:rxpermissions:0.10.2.-程序员宅基地

文章浏览阅读3.5k次。android studio 运行项目报 Could not resolve com.github.tbruyelle:rxpermissions:0.10.2.如图:提示说是没有这个版本库的缓存可以用于离线模式,搞了半天,最后发现原来是gradle设置那里把离线模式打开了,在Android Studio ---Tool Windows ---Gradle,打开如图,设置Gradle:Toggle Offline Mode, 点击这个按钮为非选中状态,即非离线状态,然后再运行项._could not resolve com.github.tbruyelle:rxpermissions:0.10.2.

利用libwebsockets写ws、wss服务端和客户端_libwsclient_send-程序员宅基地

文章浏览阅读3.2k次。服务端:server.c#include "libwebsockets.h"#include <signal.h>#include <string.h>static volatile int exit_sig = 0;#define MAX_PAYLOAD_SIZE 10 * 1024void sighdl( int sig ) { lwsl_notice( "%d traped", sig ); exit_sig = 1;}/** _libwsclient_send

随便推点

unity热更新框架Xlua--自定义Loader方式_xlua 使用两次自定义loader-程序员宅基地

文章浏览阅读1.8w次。本博客根据51CTOscholl刘国柱老师网课编写,小白笔记,侵权必删创建C#脚本:using System.Collections;using System.Collections.Generic;using UnityEngine;using XLua;using System.IO;public class RunluaBySelfDefloader : MonoBeha..._xlua 使用两次自定义loader

grasshopper for rhino 6下载_Grasshopper做分形图案-程序员宅基地

文章浏览阅读280次。【长文多图预警】大家对于“分形”这个词并不陌生。一般来说,拥有“自相似”性质的图形属于分形。简而言之,如果你把一个图形放大,看到和它本身一模一样的形状,那么可以认为这个图形是“分形”的。它们还拥有无限多的细节,堪称最美丽的几何图形。虽然分形最初是用来测量和表述自然界中有粗糙边界的物体(比如海岸线),而且有严谨的定义,但本文不讨论这些,仅讨论使用迭代方法绘制分形。在Grasshopper中,绘制分形..._grasshopper for rhino 6

Java定时任务-ScheduledExecutorService_scheduledexecutortask-程序员宅基地

文章浏览阅读1.1k次。1.ScheduledExecutorService的接口介绍package java.util.concurrent;public interface ScheduledExecutorService extends ExecutorService { //单次执行,在指定延时delay后运行command任务 public ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit);_scheduledexecutortask

处理Oracle中杀不掉的锁-程序员宅基地

文章浏览阅读147次。一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。现在提供一种方法解决这种问题,那1.就是在ORACLE中杀不掉的,2.在OS一级再杀。 1.下面的语句用来查询哪些对象被锁: select a.object_name,a.object_type,s.osuser,s.username,s.status,machine,s.s..._locked mode 为6杀不掉

基于用户乘车行为大数据的客流分析及预测模型_轨道交通大数据分析模型有哪些-程序员宅基地

文章浏览阅读1.1k次。目录 一.项目说明 1项目背景 1问题说明 1任务要求 1二.包含技术 2本项目用到的技术 2三.数据格式 2客流数据 2天气数据 2构建数据 2四.设计过程 3环境配置 3 1.相应库的导入 3 2.数据的读取 4 3.数据探索 4 4.数据合并 5 5.数据预处理 5 5.1查看数据分布 5 5.2异常数据处理 5 5.3构造特征值 7 6.特征相关性分析 7 7.目标相关性分析 8 8.LSTM模型搭建 8 9.预测及结果可视化 9五.个人总结 10_轨道交通大数据分析模型有哪些

java转双层pdf文件_双层ofd转pdf时报错,带图片带坐标的那种格式-程序员宅基地

文章浏览阅读1.9k次。双层ofd转pdf时报错,带图片带坐标的那种格式org.ofdrw.reader.BadOFDException: OFD解析失败,原因:无法在目录: C:\Users\ADMINI~1\AppData\Local\Temp\ofd-tmp-3503787938540531089\Doc_0中找到,文件 [ Annotations.xml ]at org.ofdrw.reader.OFDReade..._无法在目录: /ofd-tmp-72300205115873

推荐文章

热门文章

相关标签