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

Lateral 查询详解:概念、适用场景与普通 JOIN 的区别

1. 什么是Lateral查询?

Lateral查询(也称为横向关联查询)是一种特殊的子查询,允许子查询中引用外层查询的列(即关联引用),并在执行时逐行对外层查询的每一行数据执行子查询。  语法上通常使用关键字 LATERAL(部分数据库如PostgreSQL支持),或通过特定语法隐式实现(如Oracle的CROSS APPLY/OUTER APPLY)。

图片

示例
-- 显式LATERAL(PostgreSQL)SELECT t1.id, t2.amountFROM t1,LATERAL (SELECT amount FROM t2 WHERE t2.id = t1.id) t2;
-- 隐式实现(Oracle/SQL Server)SELECT t1.id, t2.amountFROM t1CROSS APPLY (SELECT amount FROM t2 WHERE t2.id = t1.id) t2;

2. Lateral查询的适用场景

Lateral查询主要用于以下场景:

场景1:逐行依赖计算

当子查询需要基于外层查询的当前行动态计算时,必须使用Lateral。  案例:计算每个用户的最近一笔订单金额。  SELECT u.user_id, o.order_amount

FROM users u,LATERAL (    SELECT amount AS order_amount    FROM orders    WHERE user_id = u.user_id    ORDER BY order_date DESC    LIMIT 1  -- 每行用户只取最新订单) o;

说明:  普通JOIN无法实现“每行限制结果”(如LIMIT 1),而Lateral子查询会为每个user_id单独执行。

场景2:JSON/数组展开

解析嵌套数据结构(如JSON数组、XML)时,需将数组元素展开为多行。  案例:展开用户标签数组。  

SELECT u.user_id, tag.tag_nameFROM users u,LATERAL jsonb_array_elements(u.tags) AS tag(tag_name);

说明:  jsonb_array_elements函数为每个用户的标签数组生成多行,依赖外层查询的u.tags字段。

场景3:复杂聚合与过滤

当聚合逻辑需要依赖外层条件时,Lateral比普通JOIN更直观。  案例:统计每个用户消费金额超过平均值的订单数。  SELECT u.user_id, COUNT(o.order_id) AS high_value_orders

FROM users u,LATERAL (    SELECT order_id    FROM orders    WHERE user_id = u.user_id AND amount > (        SELECT AVG(amount) FROM orders WHERE user_id = u.user_id    )) oGROUP BY u.user_id;

3. Lateral查询 vs 普通JOIN

特性Lateral查询普通JOIN(LEFT JOIN/INNER JOIN)
执行逻辑逐行执行子查询,依赖外层当前行数据先完成所有表关联,再过滤或聚合
关联引用子查询可引用外层列子查询不能直接引用外层列(需通过JOIN条件)
性能可能较慢(N次子查询)通常更快(单次扫描+哈希连接)
适用操作支持LIMIT、窗口函数等逐行操作无法在JOIN中直接使用LIMIT
典型语法LATERALCROSS APPLYOUTER APPLYJOIN ... ONWHERE

4. 何时选择Lateral查询?

  • ✅ 需要逐行处理(如LIMIT、窗口函数)。  

  • ✅ 子查询依赖外层列且无法通过普通JOIN条件表达。  

  • ✅ 展开嵌套数据结构(JSON/数组)。  

  • ❌ 大数据量场景慎用(可能性能较差)。  

5. 总结

  • Lateral查询通过逐行执行子查询,解决了普通JOIN无法处理的动态关联问题。  

  • 核心优势:支持复杂逐行逻辑(如LIMIT、JSON展开)。  

  • 代价:可能因N次子查询导致性能下降,需结合优化器规则(如PawSQL的解关联)权衡使用。  

在实际应用中,优先尝试用普通JOIN优化,仅在必要时使用Lateral。

相关文章:

Lateral 查询详解:概念、适用场景与普通 JOIN 的区别

1. 什么是Lateral查询? Lateral查询(也称为横向关联查询)是一种特殊的子查询,允许子查询中引用外层查询的列(即关联引用),并在执行时逐行对外层查询的每一行数据执行子查询。 语法上通常使用关…...

[langchain教程]langchain03——用langchain构建RAG应用

RAG RAG过程 离线过程: 加载文档将文档按一定条件切割成片段将切割的文本片段转为向量,存入检索引擎(向量库) 在线过程: 用户输入Query,将Query转为向量从向量库检索,获得相似度TopN信息将…...

Web 前端包管理工具深度解析:npm、yarn、pnpm 全面对比与实战建议

引言: 在现代web前端开发中,包管理工具的重要性不言而喻,无论是构建项目脚手架,安装ui库,管理依赖版本,还是实现monorepo项目结构,一个高效稳定的包管理工具都会大幅提升开发体验和协作效率 作为一名前端工程师,深入了解这些工具背后的机制与差异,对于提升项目可维护性和团队…...

【springsecurity oauth2授权中心】简单案例跑通流程 P1

项目被拆分开,需要一个授权中心使得每个项目都去授权中心登录获取用户权限。而单一项目里权限使用的是spring-security来控制的,每个controller方法上都有 PreAuthorize("hasAuthority(hello)") 注解来控制权限,想以最小的改动来实…...

spark—SQL3

连接方式 内嵌Hive: 使用时无需额外操作,但实际生产中很少使用。 外部Hive: 在虚拟机下载相关配置文件,在spark-shell中连接需将hive-site.xml拷贝到conf/目录并修改url、将MySQL驱动copy到jars/目录、把core-site.xml和hdfs-sit…...

Linux-scp命令

scp(Secure Copy Protocol)是基于 SSH 的安全文件传输命令,用于在本地和远程主机之间加密传输文件或目录。以下是详细用法和示例: 基本语法 scp [选项] 源文件 目标路径常用选项 选项描述-P 端口号指定 SSH 端口(默认…...

【PyQt5】@QtCore.pyqtSlot()的作用

在 PyQt5 中,QtCore.pyqtSlot() 是一个装饰器,用于将普通的 Python 方法标记为 可被信号连接的槽函数。它的主要作用是: 1. 标识槽函数 核心作用:告诉 PyQt 这个方法是一个槽(Slot),可以被信号…...

Go语言中的Context

目录 Go语言中的Context 1. Context的基本概念 1.1 Context的核心作用 2. Context的基本用法 2.1 创建Context 背景Context 可取消的Context 带有超时的Context 2.2 在Goroutine间传递Context 2.3 获取Context的值 为Context添加自定义数据 访问Context中的值 3. C…...

小刚说C语言刷题——1039 求三个数的最大数

1.题目描述 已知有三个不等的数,将其中的最大数找出来。 输入 输入只有一行,包括3个整数。之间用一个空格分开。 输出 输出只有一行(这意味着末尾有一个回车符号),包括1个整数。 样例 输入 1 5 8 输出 8 2.…...

一文了解相位阵列天线中的真时延

本文要点 真时延是宽带带相位阵列天线的关键元素之一。 真时延透过在整个信号频谱上应用可变相移来消除波束斜视现象。 在相位阵列中使用时延单元或电路板,以提供波束控制和相移。 市场越来越需要更快、更可靠的通讯网络,而宽带通信系统正在努力满…...

在 UE5 编辑器中,由于游戏设置 -> EV100 设置,点击播放前后的光照不同。如何保持点击播放前后的光照一致?

​In Unreal Engine 5 (UE5), discrepancies in lighting between the editor and play modes are often due to auto exposure settings, particularly when using the EV100 system. To maintain consistent lighting across both modes, follow these steps:​YouTube1Epic …...

Git 配置 GPG 提交签名

使用 GPG 对 Git 提交进行签名,可以证明该提交确实是你本人提交的。这在团队协作和代码审核中非常有用,GitHub/GitLab 等平台也会显示 “Verified” 标签。 🧩 一、检查是否已安装 GPG gpg --version 如果未安装,可使用以下命令…...

linux学习 5 正则表达式及通配符

重心应该放在通配符的使用上 正则表达式 正则表达式是用于 文本匹配和替换 的强大工具 介绍两个交互式的网站来学习正则表达式 regexlearn 支持中文 regexone 还有一个在线测试的网址 regex101 基本规则 符号作用示例.匹配任何字符除了换行a.b -> axb/a,b[abc]匹配字符…...

eplan许可证与版本兼容性问题

在使用EPLAN电气设计软件时,确保许可证与软件版本之间的兼容性至关重要。不兼容的许可证可能导致软件无法正常运行,影响工作效率。本文将为您深入解析EPLAN许可证与版本兼容性问题,并提供解决方案,确保您的软件始终处于最佳状态。…...

【Easylive】AdminFilter 详细解析

【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 AdminFilter 详细解析 AdminFilter 是一个 Spring Cloud Gateway 的过滤器,用于在请求到达微服务之前进行 权限校验(如管理员 Token 验证)。以下是逐行解…...

纷析云开源财务软件:助力企业实现数字化自主权

在数字化转型浪潮中,企业财务管理面临高成本、低灵活性、数据孤岛等痛点。纷析云开源财务软件(项目地址:https://gitee.com/shenxji/fxy)凭借其开源基因与模块化设计,为企业提供了一条“低成本、高可控”的数字化路径。…...

基于超启发鲸鱼优化算法的混合神经网络多输入单输出回归预测模型 HHWOA-CNN-LSTM-Attention

基于超启发鲸鱼优化算法的混合神经网络多输入单输出回归预测模型 HHWOA-CNN-LSTM-Attention 随着人工智能技术的飞速发展,回归预测任务在很多领域得到了广泛的应用。尤其在金融、气象、医疗等领域,精确的回归预测模型能够为决策者提供宝贵的参考信息。为…...

解决使用hc595驱动LED数码管亮度低的问题

不知道大家在做项目的时候有没有遇到使用hc595驱动LED数码管亮度低的问题(数码管位数较多),如果大佬们有好的方法的可以评论区留言 当时我们解决是换成了天微的驱动芯片,现在还在寻找新的解决办法(主要软件不花钱&…...

【Linux】轻量级命令解释器minishell

Minishell 一、项目背景 在linux操作系统中,用户对操作系统进行的一系列操作都不能直接操作内核,而是通过shell间接对内核进行操作。 Shell 是操作系统中的一种程序,它为用户提供了一种与操作系统内核和计算机硬件进行交互的界面。用户可以通…...

Android RK356X TVSettings USB调试开关

Android RK356X TVSettings USB调试开关 平台概述操作-打开USB调试实现源码补充说明 平台 RK3568 Android 11 概述 RK3568 是瑞芯微(Rockchip)推出的一款高性能处理器,支持 USB OTG(On-The-Go)和 USB Host 功能。US…...

CGAL 计算直线之间的距离(3D)

文章目录 一、简介二、实现代码三、实现效果一、简介 这里的计算思路很简单: 1、首先将两个三维直线均平移至过原点处,这里两条直线可以构成一个平面normal。 2、如果两个直线平行,那么两条直线之间的距离就转换为直线上一点到另一直线的距离。 3、如果两个直线不平行,则可…...

消息队列知识点详解

消息队列场景 什么是消息队列 可以把消息队列理解一个使用队列来通信的组件,它的本质是交换机队列的模式,实现发送消息,存储消息,消费消息的过程。 我们通常说的消息队列,MQ其实就是消息中间件,业界中比较…...

序列号绑定的SD卡坏了怎么办?

在给SD卡烧录程序的时候,大家发现有的卡是无法烧录的,如:复印机的SD卡不能被复制通常涉及以下几个技术原因,可能与序列号绑定、加密保护或硬件限制有关: 一、我们以复印机的系统卡为例来简单讲述一下 序列号或硬件绑定…...

使用SystemWeaver生成SOME/IP ETS ARXML的完整实战指南

使用SystemWeaver生成SOME/IP ETS ARXML的完整实战指南 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 一、SystemWeaver与SOME/IP基础认知 1.1 SystemWe…...

基于单片机的BMS热管理功能设计

标题:基于单片机的BMS热管理功能设计 内容:1.摘要 摘要:在电动汽车和储能系统中,电池管理系统(BMS)的热管理功能至关重要,它直接影响电池的性能、寿命和安全性。本文的目的是设计一种基于单片机的BMS热管理功能。采用…...

Flutter 状态管理 Riverpod

Android Studio版本 Flutter SDK 版本 将依赖项添加到您的应用 flutter pub add flutter_riverpod flutter pub add riverpod_annotation flutter pub add dev:riverpod_generator flutter pub add dev:build_runner flutter pub add dev:custom_lint flutter pub add dev:riv…...

【HarmonyOS 5】VisionKit人脸活体检测详解

【HarmonyOS 5】VisionKit人脸活体检测详解 一、VisionKit人脸活体检测是什么? VisionKit是HamronyOS提供的场景化视觉服务工具包。 华为将常见的解决方案,通常需要三方应用使用SDK进行集成。华为以Kit的形式集成在HarmoyOS系统中,方便三方…...

Pycharm(九)函数的闭包、装饰器

目录 一、函数参数 二、闭包 三、装饰器 一、函数参数 def func01():print("func01 shows as follows") func01() # 函数名存放的是函数所在空间的地址 print(func01)#<function func01 at 0x0000023BA9FC04A0> func02func01 print(func02)#<function f…...

【深度学习】详解矩阵乘法、点积,内积,外积、哈达玛积极其应用|tensor系列02

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a;【深度学习】你真的理解张量了吗&#xff1f;|标量、向量、矩阵、张量的秩|01每日一言&#x1f33c;: “脑袋想不明白的&#xff0c;就用脚想”…...

MH2103系列coremark1.0跑分数据和优化,及基于arm2d的优化应用

CoreMark 1.0 介绍 CoreMark 是由 EEMBC&#xff08;Embedded Microprocessor Benchmark Consortium&#xff09;组织于 2009 年推出的一款用于衡量嵌入式系统 CPU 或 MCU 性能的标准基准测试工具。它旨在替代陈旧的 Dhrystone 标准&#xff08;Dhrystone 容易受到各种libc不同…...