当前位置: 首页 > news >正文

Oracle SQL - CONNECT BY语句Where条件中不能使用OR?[已解决]

  • 数据
SQL> SELECT * FROM demo_a;CUSTOMER        TOTAL
---------- ----------
A                 100200SQL> SELECT * FROM demo_b;CUSTOMER           RN        QTY
---------- ---------- ----------
A                   1         30
A                   2         60
A                   3         101        1902         10
  • 目标

以CUST字段内容关联A、B两表:相等或同时为空,并按B表RN字段的顺序累计QTY数值,截止到不超过A表对应TOTAL值的行

  • 问题

先将两表关联起来

SQL> SELECT *2    FROM demo_a a,3         (SELECT t.*, SUM(qty) over(PARTITION BY customer ORDER BY rn) sum_qty4            FROM demo_b t) b5   WHERE (a.customer IS NULL AND b.customer IS NULL OR6         a.customer = b.customer)7  ;CUSTOMER        TOTAL CUSTOMER           RN        QTY    SUM_QTY
---------- ---------- ---------- ---------- ---------- ----------
A                 100 A                   1         30         30
A                 100 A                   2         60         90
A                 100 A                   3         10        100200                     1        190        190200                     2         10        200

整理得到递归条件为:当SUM_QTY小于TOTAL时,则RN应当加1

SQL> SELECT *2    FROM demo_a a,3         (SELECT t.*, SUM(qty) over(PARTITION BY customer ORDER BY rn) sum_qty4            FROM demo_b t) b5   WHERE (a.customer IS NULL AND b.customer IS NULL OR6         a.customer = b.customer)7   START WITH b.rn = 18  CONNECT BY (PRIOR a.customer IS NULL AND a.customer IS NULL OR9             PRIOR a.customer = a.customer)10         AND PRIOR b.sum_qty < PRIOR a.total11         AND b.rn = PRIOR b.rn + 112  ;CUSTOMER        TOTAL CUSTOMER           RN        QTY    SUM_QTY
---------- ---------- ---------- ---------- ---------- ----------

没有结果,若是将Where条件改为a.customer = b.customer则可正常得出结果,但这会漏掉CUST为空的数据。难道递归查询中不可以使用OR来关联表吗

  • 原因

观察执行计划

---------------------------------------------------------------------------------------------------
| Id  | Operation                                | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                         |        |       |       |     6 (100)|          |
|*  1 |  FILTER                                  |        |       |       |            |          |
|*  2 |   CONNECT BY NO FILTERING WITH START-WITH|        |       |       |            |          |
|*  3 |    HASH JOIN                             |        |     5 |   430 |     5  (20)| 00:00:01 |
|   4 |     TABLE ACCESS FULL                    | DEMO_A |     2 |    60 |     2   (0)| 00:00:01 |
|   5 |     VIEW                                 |        |     5 |   280 |     3  (34)| 00:00:01 |
|   6 |      WINDOW SORT                         |        |     5 |   215 |     3  (34)| 00:00:01 |
|   7 |       TABLE ACCESS FULL                  | DEMO_B |     5 |   215 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------1 - filter(("A"."CUSTOMER" IS NULL AND "B"."CUSTOMER" IS NULL))2 - filter("B"."RN"=1)3 - access("A"."CUSTOMER"="B"."CUSTOMER")

可见两表关联处(id=3)仅使用了谓词:a.customer=b.customer,而a.customer is null and b.customer is null则成为了最终结果集的一个筛选谓词(id=1)

究其原因,在递归查询的Where条件中,最先执行的是表关联条件,其它筛选条件则是在递归后执行。此处所指的表关联条件必须是同时出现两个表的表达式,a.customer is null and b.customer is null由于仍可分为两个表达式,而每个表达式中只出现了一个表,故作为了最后执行的筛选条件

此例程中表关联条件可以使用NVL处理以使两表同时出现

SQL> SELECT *2    FROM demo_a a,3         (SELECT t.*, SUM(qty) over(PARTITION BY customer ORDER BY rn) sum_qty4            FROM demo_b t) b5   WHERE nvl(a.customer, 'NULL') = nvl(b.customer, 'NULL')6   START WITH b.rn = 17  CONNECT BY (PRIOR a.customer IS NULL AND a.customer IS NULL OR8             PRIOR a.customer = a.customer)9         AND PRIOR b.sum_qty < PRIOR a.total10         AND b.rn = PRIOR b.rn + 111  ;CUSTOMER        TOTAL CUSTOMER           RN        QTY    SUM_QTY
---------- ---------- ---------- ---------- ---------- ----------
A                 100 A                   1         30         30
A                 100 A                   2         60         90
A                 100 A                   3         10        100200                     1        190        190200                     2         10        200

相关文章:

Oracle SQL - CONNECT BY语句Where条件中不能使用OR?[已解决]

数据 SQL> SELECT * FROM demo_a;CUSTOMER TOTAL ---------- ---------- A 100200SQL> SELECT * FROM demo_b;CUSTOMER RN QTY ---------- ---------- ---------- A 1 30 A 2 …...

python-逻辑语句

if else语句 不同于C&#xff1a;else if range语句&#xff1a; continue continue的作用是&#xff1a; 中断所在循环的当次执行&#xff0c;直接进入下一次 continue在嵌套循环中的应用 break 直接结束所在的循环 break在嵌套循环中的应用 continue和break&#xff0c;在…...

【stm32】大一上学期笔记复制

砌墙单片机 外设是什么&#xff1f; ipage 8 nx轴 128 X0-127 y0-63 PWM脉冲宽度调制 PWM脉冲宽度调制 2023年10月13日 基本特性&#xff1a;脉冲宽度调制PWM是一种对模拟信号进行数字编码的方法。广泛引用于电机控制&#xff0c;灯光的亮度调节&#xff0c;功率控制等领域…...

LeetCode题练习与总结:二叉树的前序遍历--144

一、题目描述 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;roo…...

如何优化Spring Boot应用的性能

如何优化Spring Boot应用的性能 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何通过优化技术和最佳实践来提升Spring Boot应用的性能&#x…...

人工智能--目标检测

欢迎来到 Papicatch的博客 文章目录 &#x1f349;引言 &#x1f349;概述 &#x1f348;目标检测的主要流程通常包括以下几个步骤 &#x1f34d;数据采集 &#x1f34d;数据预处理 &#x1f34d;特征提取 &#x1f34d;目标定位 &#x1f34d;目标分类 &#x1f348;…...

Java基础之List实现类

文章目录 一、基本介绍二、常见方法三、ArrayList注意事项四、ArrayList底层结构我的理解 五、ArrayList扩容机制无参构造器有参构造器 六、LinkedList介绍底层操作机制 七、ArrayList 与 LinkedListArrayListLinkedList tip&#xff1a;以下是正文部分 一、基本介绍 List集合…...

java List接口介绍

List 是 Java 集合框架中的一个接口,它继承自 Collection 接口,代表一个有序的元素集合。List 允许重复的元素,并且可以通过索引来访问元素。Java 提供了多种 List 的实现,如 ArrayList、LinkedList、Vector 和 CopyOnWriteArrayList。 List接口概述 List 接口提供了一些…...

调度器APScheduler定时执行任务

APScheduler&#xff08;Advanced Python Scheduler&#xff09;是一个Python库&#xff0c;用于调度任务&#xff0c;使其在预定的时间间隔或特定时间点执行。它支持多种调度方式&#xff0c;包括定时&#xff08;interval&#xff09;、日期&#xff08;date&#xff09;和Cr…...

git合并分支的疑问

今天遇到一个奇怪的问题&#xff1a; 1、后端从master拉了三个分支。分别为dev、test、和stage。 2、研发1从dev拉了分支feature1,然后commit、commit、commit……。最后request merge到dev、test和stage。成功了。 3、研发2从dev拉了分支feature2,注意&#xff0c;feature2…...

catia数控加工仿真Productlist无法添加部件或零件

这种情况是没有把NCSetup显示 在工具中勾选即可...

关于Pycharm右下角不显示解释器interpreter的问题解决

关于Pycharm右下角不显示解释器interpreter的问题 在安装新的Pycharm后&#xff0c;发现右下角的 interpreter 的选型消失了&#xff1a; 觉得还挺不习惯的&#xff0c;于是网上找解决办法&#xff0c;无果。 自己摸索了一番后&#xff0c;发现解决办法如下&#xff1a; 勾…...

为什么word生成的PDF内容显示不全?

在现代办公环境中&#xff0c;将文档从一个格式转换为另一个格式是一个常见的任务。然而&#xff0c;有时候我们可能会遇到意想不到的问题&#xff0c;比如使用Word转换成PDF时&#xff0c;生成的PDF文件只显示了整个界面的四分之一内容。这种问题不仅令人困扰&#xff0c;也可…...

JVM专题十三:总结与整理(持续更新)

图解JVM JVM与Java体系结构 JVM垃圾回收算法 JVM垃圾回收器 图解JVM主要是放了前面12个章节的我们给大家画的图&#xff0c;做了整体的汇总&#xff0c;大家可以根据图区回忆我们所说的内容&#xff0c;查缺补漏。 实战经验 1、项目中数据量多少&#xff0c;QPS与TPS最高多少…...

MobPush iOS端海外推送最佳实现

推送注册 在AppDelegate里进行SDK初始化&#xff08;也可以在Info.plist文件中进行AppKey&#xff0c;AppSecret的配置&#xff09;并对通知功能进行注册以及设置推送的环境和切换海外服务器等&#xff0c;参考如下步骤代码&#xff1a; <span style"background-colo…...

商家团购app微信小程序模板

手机微信商家团购小程序页面&#xff0c;商家订餐外卖小程序前端模板下载。包含&#xff1a;团购主页、购物车订餐页面、我的订单、个人主页等。 商家团购app微信小程序模板...

探索AudioLM:音频生成技术的未来

目录 2. AudioLM的基础理论 2.1. 音频生成的基本概念 2.2. 语言模型在音频生成中的应用 2.3. 深度学习在音频生成中的作用 3. AudioLM的架构与实现 3.1. AudioLM的基本架构 3.1.1 编码器 3.1.2 解码器 3.1.3 生成模块 3.2. 训练过程 3.2.1 数据预处理 3.2.2 损失函…...

计算机视觉:深入了解图像分类、目标检测和图像分割的核心技术

计算机视觉是什么&#xff1f; 计算机视觉是一门致力于让计算机“看懂”图像和视频的技术&#xff0c;它旨在通过模拟人类视觉系统来理解和解释数字化视觉信息。这一领域涉及图像的获取、处理、分析和理解&#xff0c;最终用于从视觉数据中提取有用信息并做出决策。计算机视觉的…...

Django 安装 Zinnia 后出现故障

在Django中安装和配置Zinnia时遇到故障可能有多种原因&#xff0c;通常包括版本兼容性、依赖关系或配置问题。这里提供一些常见的解决方法和调试步骤&#xff0c;帮助大家解决问题。 首先&#xff0c;确保您安装的Zinnia版本与Django版本兼容。查看Zinnia的官方文档或GitHub页…...

.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作

一、准备工作 1、本地部署MinIO服务 2、创建MinIO的Access Key 3、创建.net 项目 4、下载MinIO sdk 5、相关文档 二、编写MinIO工具类 三、管理存储桶 1、MyBucket类 &#xff08;1&#xff09;判断bucket是否存在 &#xff08;2&#xff09;新建bucket &#xff08…...

机器学习中无监督学习方法的聚类:划分式聚类、层次聚类、密度聚类

1.定义和特点 2.划分式聚类&#xff1a;K-Means 、 K-Medoids 3.层次聚类&#xff1a;树状图 4.密度聚类&#xff1a;DBSCAN 5.聚类的应用 一、定义和特点 机器学习中的无监督学习聚类是一种通过数据内在结构将样本分组的技术&#xff0c;无需预先标注的类别标签。 它的核心目…...

[SC]SystemC在CPU和GPU等复杂SoC验证中的应用

SystemC在CPU和GPU等复杂SoC验证中的应用 摘要:SystemC 是一种基于 C++ 的硬件描述和仿真语言,广泛用于系统级设计和验证,特别是在 CPU 和 GPU 等复杂 SoC (System on Chip) 的验证工作中。通过 SystemC,你可以构建硬件模块、定义时序行为、进行系统级仿真,并与 UV…...

C++深入类与对象

在上一篇中提到了构造函数&#xff0c;那么这篇再来提一下构造函数&#xff0c;编译器自动生成的默认构造函数对于内置类型不做处理&#xff0c;自定义类型会调用它自己的构造函数。对于自己写的构造函数&#xff0c;之前是在函数体中初始化&#xff0c;当然不止这一种初始化&a…...

4.8.1 利用Spark SQL实现词频统计

在利用Spark SQL实现词频统计的实战中&#xff0c;首先需要准备单词文件并上传至HDFS。接着&#xff0c;可以通过交互式方法或创建Spark项目来实现词频统计。交互式方法包括读取文本文件生成数据集&#xff0c;扁平化映射得到新数据集&#xff0c;然后将数据集转成数据帧&#…...

PyTorch中nn.Module详解

直接print(dir(nn.Module))&#xff0c;得到如下内容&#xff1a; 一、模型结构与参数 parameters() 用途&#xff1a;返回模块的所有可训练参数&#xff08;如权重、偏置&#xff09;。示例&#xff1a;for param in model.parameters():print(param.shape)named_parameters…...

10.安卓逆向2-frida hook技术-frida基本使用-frida指令(用于hook)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…...

【Unity笔记】Unity WASD+QE 控制角色移动与转向(含 Shift 加速)实现教程

摘要&#xff1a; 在 Unity 游戏开发中&#xff0c;键盘控制角色的移动与转向是基础功能之一。本文详细讲解如何使用 C# 实现基于 WASD 移动、QE 转向 与 Shift 加速奔跑 的角色控制器&#xff0c;适用于第一人称、第三人称、自由漫游等场景。通过直观的 Transform 控制方法与可…...

LeetCode Hot100(矩阵)

73. 矩阵置零 这边提供nm的做法以及更少的思路&#xff0c;对于nm的做法&#xff0c;我们只需要开辟标记当前行是否存在0以及当前列是否存在0即可&#xff0c;做法如下 class Solution {public void setZeroes(int[][] matrix) {int arr[]new int[matrix.length];int brr[]ne…...

RG3000网关构建5G LAN智慧工厂智能制造

在工业4.0与智能制造的趋势下&#xff0c;传统制造业正前后往智慧工厂转型升级。在转型过程中&#xff0c;高效、稳定、灵活的网络通信是实现设备互联互通、数据实时交互与智能决策的基础。智联物联RG3000网关&#xff0c;凭借其融合5G通信技术、WiFi6无线传输、边缘计算能力与…...

如何制作全景VR图?

全景VR图&#xff0c;特别是720度全景VR&#xff0c;为观众提供一种沉浸式体验。 全景VR图能够捕捉场景的全貌&#xff0c;还能将多个角度的图片或视频无缝拼接成一个完整的全景视角&#xff0c;让观众在虚拟环境中自由探索。随着虚拟现实&#xff08;VR&#xff09;技术的飞速…...