当前位置: 首页 > 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…...

为什么选择BetterNCM:5个实用技巧让你的网易云音乐焕然一新

为什么选择BetterNCM&#xff1a;5个实用技巧让你的网易云音乐焕然一新 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 想要解锁网易云音乐隐藏功能&#xff0c;让听歌体验更上一层楼吗…...

BLE心率监测服务开发:从GATT协议到CCCD通知机制的完整实现

1. 项目概述如果你正在开发一款智能手环、心率带或者任何需要实时上报生理数据的可穿戴设备&#xff0c;那么蓝牙低功耗&#xff08;BLE&#xff09;的心率监测服务&#xff08;Heart Rate Service, HRS&#xff09;几乎是你绕不开的核心功能。这个看似标准的服务&#xff0c;其…...

告别Anchor和NMS!用DETR在NWPU遥感数据集上跑出88%AP的保姆级教程

告别Anchor和NMS&#xff01;用DETR在NWPU遥感数据集上跑出88%AP的保姆级教程 遥感图像目标检测一直是计算机视觉领域的重要研究方向&#xff0c;但传统方法如Faster R-CNN和YOLO系列在处理遥感目标时存在诸多限制。本文将带你深入了解DETR(Detection with Transformers)这一革…...

解读:脓毒症相关脑病发病机制、诊断和治疗的最新进展

一、脓毒症相关脑病&#xff08;SAE&#xff09;的核心定义与临床特征&#xff08;一&#xff09;疾病本质SAE是由脓毒症诱发的弥漫性脑功能障碍综合征&#xff0c;诊断需排除中枢神经系统直接感染及其他各类代谢性脑病的干扰&#xff0c;核心是脓毒症介导的脑功能异常。病理层…...

告别Labelme!用Roboflow快速标注你的UNet语义分割数据集(附完整代码)

告别Labelme&#xff01;用Roboflow快速标注你的UNet语义分割数据集&#xff08;附完整代码&#xff09; 还在为手动标注图像数据而头疼&#xff1f;传统工具如Labelme虽然功能强大&#xff0c;但面对团队协作和大批量数据时&#xff0c;效率瓶颈明显。本文将带你体验Roboflow这…...

Cursor编辑器使用统计工具:量化开发效率与AI辅助深度分析

1. 项目概述&#xff1a;一个为开发者量身定制的Cursor使用统计工具如果你和我一样&#xff0c;日常开发重度依赖Cursor这款AI代码编辑器&#xff0c;那你肯定也好奇过&#xff1a;我到底有多“卷”&#xff1f;每天在编辑器里花了多少时间&#xff1f;最常用的功能是哪些&…...

4G/5G EPS会话管理机制与QoS优化实践

1. EPS会话管理核心机制解析在4G/5G移动通信系统中&#xff0c;EPS&#xff08;演进分组系统&#xff09;的会话管理架构通过多层抽象实现了精细化的业务流控制。这套机制的核心价值在于&#xff1a;用标准化的方式将不同QoS需求的业务流映射到对应的传输通道上&#xff0c;同时…...

ARM与中科创达物联网加速器:一站式平台如何重塑产品开发

1. 项目概述&#xff1a;ARM与中科创达的物联网生态加速器2015年&#xff0c;半导体IP巨头ARM与总部位于北京的中科创达&#xff08;Thundersoft&#xff09;联合宣布&#xff0c;将在中国建立“ARM创新生态加速器”。这个消息在当时可能只是科技新闻版块的一则快讯&#xff0c…...

Git冲突解决终极指南:5步掌握hello-git实战视频中的冲突处理技巧

Git冲突解决终极指南&#xff1a;5步掌握hello-git实战视频中的冲突处理技巧 【免费下载链接】hello-git Curso para aprender a trabajar con el sistema de control de versiones Git y la plataforma GitHub desde cero y para principiantes. 项目地址: https://gitcode.…...

AI编程助手Code-Buddy:本地优先、插件化架构与工程实践全解析

1. 项目概述&#xff1a;一个为开发者量身打造的智能代码伙伴 最近在逛GitHub的时候&#xff0c;发现了一个挺有意思的项目&#xff0c;叫 runkids/code-buddy 。光看名字&#xff0c;“代码伙伴”&#xff0c;就让人感觉这应该是个能帮我们写代码、解决开发问题的工具。点进…...