深入解析Oracle数据库中的标量子查询(Scalar Subquery)及其等价改写方法
在Oracle数据库中,标量子查询(Scalar Subquery)是一种特殊的子查询,它返回单个值作为结果,而不是一组记录。标量子查询通常嵌套在另一个查询的SELECT列表、WHERE子句、HAVING子句或表达式中,它就像一个可以在查询运行时动态计算的函数,返回一个确定的值。
标量子查询的基本结构是这样的:
SELECT ..., (SELECT single_value_expressionFROM another_tableWHERE some_condition) AS alias,...
FROM main_table
WHERE some_column = (SELECT single_valueFROM yet_another_tableWHERE another_condition)
例如:
-
在SELECT列表中使用标量子查询:
SELECT e.first_name, e.salary,(SELECT MAX(salary) FROM employees WHERE department_id = e.department_id) as max_salary FROM employees e上面的查询将返回每个员工的名字、薪水以及他们所在部门的最高薪水。
-
在WHERE子句中使用标量子查询:
SELECT last_name, salary FROM employees WHERE salary > (SELECT AVG(salary)FROM employeesWHERE job_id = 'SALES_REP' )此处查询返回所有薪水高于销售代表平均薪水的员工姓名和薪水。
标量子查询有一些关键特性:
- 它必须保证只返回一行一列的数据。
- 如果子查询返回零行,则标量子查询表达式的值通常是NULL。
- 如果子查询返回多于一行,则Oracle数据库会抛出错误,因为标量子查询只能返回单一值。
在性能方面,标量子查询可能不如其他查询优化技术高效,特别是当主表很大且子查询需要多次执行时。因此,在设计查询时,应当尽可能优化标量子查询,例如通过添加适当的索引、考虑改写为联接查询或其他更适合大规模数据集的方法。
在Oracle数据库中,标量子查询改写主要是为了提高查询性能或者简化SQL语句结构。以下是一些常见的标量子查询改写方法:
方法1:将标量子查询改写为内联视图(Inline View)
将子查询作为一个临时的内嵌表(Inline View)进行引用,可以减少多次执行子查询带来的开销。
-- 原始标量子查询
SELECT e.emp_no, (SELECT m.max_salary FROM employee_salaries m WHERE m.emp_no = e.emp_no) as max_salary
FROM employees e;-- 改写为内联视图
SELECT e.emp_no, i.max_salary
FROM employees e
JOIN (SELECT emp_no, MAX(salary) as max_salaryFROM employee_salariesGROUP BY emp_no) i
ON e.emp_no = i.emp_no;
方法2:使用分析函数替换标量子查询
对于一些涉及聚合函数的标量子查询,可以使用窗口函数(OVER()子句)或者RANK、DENSE_RANK、ROW_NUMBER等分析函数来替代。
-- 原始标量子查询
SELECT e.name, (SELECT MAX(salary) FROM employee_salaries WHERE emp_no = e.emp_no) as max_salary
FROM employees e;-- 改写为窗口函数
SELECT e.name, MAX(salary) OVER (PARTITION BY e.emp_no) as max_salary
FROM employees e
JOIN employee_salaries es ON e.emp_no = es.emp_no;
方法3:使用JOIN操作代替标量子查询
在某些情况下,可以用JOIN操作结合GROUP BY或DISTINCT来实现相同功能。
-- 原始标量子查询
SELECT e.name, (SELECT COUNT(*) FROM orders o WHERE o.emp_id = e.id) as order_count
FROM employees e;-- 改写为JOIN
SELECT e.name, COUNT(o.order_id) as order_count
FROM employees e
LEFT JOIN orders o ON e.id = o.emp_id
GROUP BY e.name;
方法4:使用CASE表达式配合GROUP BY
在特定场景下,可以使用CASE表达式结合GROUP BY来达到标量子查询的目的。
-- 原始标量子查询
SELECT e.name, (SELECT CASE WHEN COUNT(o.id) > 5 THEN 'Yes' ELSE 'No' END FROM orders o WHERE o.emp_id = e.id) as has_many_orders
FROM employees e;-- 改写为CASE表达式
SELECT e.name, CASE WHEN COUNT(o.id) > 5 THEN 'Yes' ELSE 'No' END as has_many_orders
FROM employees e
LEFT JOIN orders o ON e.id = o.emp_id
GROUP BY e.name;
在实际应用中,具体改写方法需要根据实际情况和表结构进行调整,并结合执行计划和索引优化来进一步提升性能。同时,也需要考虑改写后的语义是否与原始标量子查询一致。
相关文章:
深入解析Oracle数据库中的标量子查询(Scalar Subquery)及其等价改写方法
在Oracle数据库中,标量子查询(Scalar Subquery)是一种特殊的子查询,它返回单个值作为结果,而不是一组记录。标量子查询通常嵌套在另一个查询的SELECT列表、WHERE子句、HAVING子句或表达式中,它就像一个可以…...
Pytorch多机多卡分布式训练
多机多卡分布式: 多机基本上和单机多卡差不多: 第一台机器(主设备): torchrun --master_port 6666 --nproc_per_node8 --nnodes${nnodes} --node_rank0 --master_addr${master_addr} train_with_multi_machine_an…...
win11 环境配置 之 Jmeter
一、安装 JDK 1. 安装 jdk 截至当前最新时间: 2024.3.27 jdk最新的版本 是 官网下载地址: https://www.oracle.com/java/technologies/downloads/ 建议下载 jdk17 另存为到该电脑的 D 盘下,新建jdk文件夹 开始安装到 jdk 文件夹下 2. 配…...
蓝桥杯刷题之路径之谜
题目来源 路径之谜 不愧是国赛的题目 题意 题目中会给你两个数组,我这里是分别用row和col来表示 每走一步,往左边和上边射一箭,走到终点的时候row数组和col数组中的值必须全部等于0这个注意哈,看题目看了半天,因为…...
【深度学习】图片预处理,分辨出模糊图片
ref:https://pyimagesearch.com/2015/09/07/blur-detection-with-opencv/ 论文 ref:https://www.cse.cuhk.edu.hk/leojia/all_final_papers/blur_detect_cvpr08.pdf 遇到模糊的图片,还要处理一下,把它挑出来,要么修复,要么弃用。否…...
基础NLP知识了解
基础NLP知识… 线性变换 通过一个线性变换将隐藏状态映射到另一个维度空间,以获得预期维度的向量 $ outputs hidden_layer * W b$ 这里的W是权重矩阵,b是偏置项,它们是线性变换的参数,通过训练数据学习得到。输出向量的维度…...
Android 性能优化(六):启动优化的详细流程
书接上文,Android 性能优化(一):闪退、卡顿、耗电、APK 从用户体验角度有四个性能优化方向: 追求稳定,防止崩溃追求流畅,防止卡顿追求续航,防止耗损追求精简,防止臃肿 …...
QT程序打包
将exe文件单独拿出来放入一个单独的文件夹 保存qt安装路径下有如下这个文件 windeployqt.exe 在TCPFile.exe文件夹中使用以下cmd命令运行 即可打包 windeployqt 文件名.exe 成功打包!...
ARMday7作业
实现三个按键的中断,现象和代码 do_ipr.c #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取要处理的中断的中断号unsigned int irqnoGI…...
Unity构建详解(4)——SBP的依赖后处理
【AddHashToBundleNameTask】 这个Task的作用很明确,给Bundle的名字附加一个Hash值: 根据bundle所包含的asset计算出来一个hash值添加在原来Bundle的末尾替换了BundleBuildContent.BundleLayout和aa.bundleToAssetGroup中的key 有两个问题,…...
使用GO对PostgreSQL进行有意思的多线程压测
前言 针对PostgreSQL进行压缩,有很多相关的工具。有同学又要问了,为何还要再搞一个?比如,pgbench, sysbench之类的,已经很强大了。是的,它们都很强大。但有时候,在一些特殊的场景,可…...
CI/CI实战-jenkis结合gitlab 4
实时触发 安装gitlab插件 配置项目触发器 生成令牌并保存 配置gitlab 测试推送 gitlab的实时触发 添加jenkins节点 在jenkins节点上安装docker-ce 新建节点server3 安装git和jdx 在jenkins配置管理中添加节点并配置从节点 关闭master节点的构建任务数...
修复ubuntu引导
一、制作ubuntu启动U盘 进入启动盘后,点击Try ubuntu,进入U盘的ubuntu系统。 二、配置和添加源 sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update三、运行 Boot Repair重新制作引导 sudo boot-repair注意&#x…...
11.Notepad++
文章目录 一、下载和安装设置练习 以前在记事本上写的代码看上去有点累,因为所有的单词看上去都是黑色的,并且当代码出现问题后,它提示第三行,我们还需要一行一行去数。这些问题都可以由一个高级记事本: Notepad 来解…...
实现阻塞队列
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class Main { public static void main(String[] args) throws InterruptedException { BlockingQue…...
MySQL8.X驱动datetime映射问题
MySQL8.X驱动datetime映射问题 背景:项目由SSM项目迁移至SpringBoot,对mysql数据库驱动进行了升级导致出现问题。 原因:mysql驱动的8.X版本对数据库类型datetime映射为LocalDateTime。 解决:暂时不升级mysql驱动,mys…...
【Selenium】隐藏元素的定位和操作|隐藏与isDisplay方法
一、selenium 中隐藏元素如何定位? 如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了 但是吧~~~能定位到并不意味着能操作元素(如click,clear,send_keys) 二、隐藏元素 如下图有个输入框…...
视图的作用
目录 视图的作用 创建视图 为 scott 分配创建视图的权限 查询视图 复杂视图的创建 视图更新的限制问题 更新视图中数据的部门编号(视图的存在条件) 限制通过视图修改数据表内容 创建只读的视图 复杂视图创建 oracle从入门到总裁:h…...
动态ip白名单频繁更改问题解决方案
1. 使用静态IP地址:可以通过向ISP申请静态IP地址来解决动态IP地址的变化问题,但是这种方法会比较贵。 2. 使用动态DNS:可以使用动态DNS服务,它可以将动态IP地址映射到一个固定的域名,从而使得动态IP地址处理为域名一直…...
什么是物联网监控平台?部署物联网平台有什么作用?
随着物联网技术的飞速发展,越来越多的企业开始关注并投入到这一领域。物联网监控平台作为连接物理世界与数字世界的桥梁,正逐渐成为企业数字化转型的关键组件。今天,我们将深入探讨物联网监控平台的定义、部署物联网平台的作用,以…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
