news 2026/4/15 9:44:00

DeepSeek总结的 LEFT JOIN LATERAL相关问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek总结的 LEFT JOIN LATERAL相关问题

在SQL中TA left JOIN LATERAL TB on cond 和TA left JOIN LATERAL (TB where cond) on true是否等价?与TA cross JOIN LATERAL (TB where cond) 呢?

这是一个很好的SQL问题,涉及到LATERAL JOIN的不同写法。让我们一步步分析:

1.TA LEFT JOIN LATERAL TB ON cond

TALEFTJOINLATERAL TBONcond
  • 这是标准的LATERAL LEFT JOIN
  • 对于TA的每一行,TB根据cond进行关联
  • 如果TB中没有匹配的行,仍然会返回TA的行,TB的列为NULL
  • cond可以包含TA和TB的列

2.TA LEFT JOIN LATERAL (TB WHERE cond) ON true

TALEFTJOINLATERAL(TBWHEREcond)ONtrue
  • 子查询(TB WHERE cond)先对TB进行过滤
  • 然后与TA进行LEFT JOIN,条件是true(总是成立)
  • 效果与第一种写法等价,因为:
    • 如果TB中没有匹配cond的行,子查询返回空集
    • LEFT JOIN仍然返回TA的行,TB的列为NULL
  • 不过语法上,ON true可以省略为ON 1=1或直接使用CROSS JOIN形式

3.TA CROSS JOIN LATERAL (TB WHERE cond)

TACROSSJOINLATERAL(TBWHEREcond)
  • 这不等价于前两种写法
  • CROSS JOIN不会保留TA中没有匹配的行
  • 如果TB子查询返回空集,该TA行不会出现在结果中
  • 相当于INNER JOIN的效果

等价性总结

-- 这三种写法等价:TALEFTJOINLATERAL TBONcond TALEFTJOINLATERAL(TBWHEREcond)ONtrueTALEFTJOINLATERAL(TBWHEREcond)ON1=1-- 但以下写法不等价(可能丢失TA的行):TACROSSJOINLATERAL(TBWHEREcond)

实际示例

-- 创建示例数据CREATETABLETA(idINT,val_aVARCHAR(10));CREATETABLETB(idINT,ta_idINT,val_bVARCHAR(10));INSERTINTOTAVALUES(1,'A1'),(2,'A2');INSERTINTOTBVALUES(1,1,'B1'),(2,1,'B2');-- 示例1: LEFT JOIN LATERAL - 保留所有TA行SELECT*FROMTALEFTJOINLATERAL(SELECT*FROMTBWHERETB.ta_id=TA.id)AStONtrue;-- 返回2行(TA.id=1有2个匹配,TA.id=2没有匹配但有NULL)-- 示例2: CROSS JOIN LATERAL - 可能丢失TA行SELECT*FROMTACROSSJOINLATERAL(SELECT*FROMTBWHERETB.ta_id=TA.id)ASt;-- 只返回TA.id=1的2行,TA.id=2的行被过滤掉了

性能考虑

虽然前两种写法逻辑上等价,但性能可能有差异:

  • 第一种写法:优化器可能将ON cond条件下推到TB
  • 第二种写法:WHERE条件在子查询内,优化器处理方式可能不同

建议在实际使用时查看执行计划,选择性能更好的写法。通常第一种写法更直观且被广泛支持。

在实际编程中,我遇到如下写法,在postgresql是允许的,在duckdb不允许,

select * from range(3)t(i)left JOIN LATERAL (select i+1 j) on i>1; Binder Error: Join condition for non-inner LATERAL JOIN must be a comparison between the left and right side

所以改写成下面几种写法,上面的理论解释了其中cross JOIN LATERAL(cond)写法不等价的原因。

select i,case when i>1 then j end j from range(3)t(i)left JOIN LATERAL (select i+1 j) on true; ┌───────┬───────┐ │ i │ j │ │ int64 │ int64 │ ├───────┼───────┤ │ 0 │ NULL │ │ 1 │ NULL │ │ 2 │ 3 │ └───────┴───────┘ select i,case when i>1 then j end j from range(3)t(i)cross JOIN LATERAL (select i+1 j) ; ┌───────┬───────┐ │ i │ j │ │ int64 │ int64 │ ├───────┼───────┤ │ 0 │ NULL │ │ 1 │ NULL │ │ 2 │ 3 │ └───────┴───────┘ memory D select i,j from range(3)t(i)cross JOIN LATERAL (select i+1 j where i>1) ; ┌───────┬───────┐ │ i │ j │ │ int64 │ int64 │ ├───────┼───────┤ │ 2 │ 3 │ └───────┴───────┘ memory D select i,j from range(3)t(i)left JOIN LATERAL (select i+1 j where i>1) on true; ┌───────┬───────┐ │ i │ j │ │ int64 │ int64 │ ├───────┼───────┤ │ 2 │ 3 │ │ 0 │ NULL │ │ 1 │ NULL │ └───────┴───────┘
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/29 1:53:29

translategemma-12b-it入门:从安装到多语言翻译实战

translategemma-12b-it入门:从安装到多语言翻译实战 你是否还在为跨语言沟通效率低、专业翻译成本高、小语种支持弱而困扰?是否希望在本地设备上运行一个真正轻量又强大的多语言翻译模型,不依赖云端API、不上传敏感文本、不担心数据泄露&…

作者头像 李华
网站建设 2026/4/12 12:53:53

3D Face HRN参数详解:resnet50 backbone各层特征对3D重建精度影响分析

3D Face HRN参数详解:resnet50 backbone各层特征对3D重建精度影响分析 1. 什么是3D Face HRN?——不只是“把脸变成立体”的黑箱 你可能已经试过上传一张自拍,几秒钟后就看到一张带纹理的3D人脸模型在屏幕上旋转。但有没有想过:…

作者头像 李华
网站建设 2026/4/12 17:56:25

ollama调用QwQ-32B效果展示:复杂逻辑链式推理的真实对话案例

ollama调用QwQ-32B效果展示:复杂逻辑链式推理的真实对话案例 1. 为什么QwQ-32B值得你花5分钟认真看一眼 你有没有试过让AI解决一个需要多步推演的问题?比如:“如果A比B大3岁,B比C小5岁,而三人年龄总和是67岁&#xf…

作者头像 李华
网站建设 2026/4/12 6:08:42

OFA-SNLI-VE模型实战应用:AI内容安全审核系统集成方案

OFA-SNLI-VE模型实战应用:AI内容安全审核系统集成方案 1. 为什么图文不匹配会成为内容安全的“隐形漏洞” 你有没有刷到过这样的帖子:一张风景照配着“我在纽约时代广场”,或者商品详情页里展示的是白色T恤,文字却写着“纯黑修身…

作者头像 李华
网站建设 2026/4/14 1:05:04

Qwen2.5-7B-Instruct开源大模型:vLLM部署支持LoRA微调热更新能力说明

Qwen2.5-7B-Instruct开源大模型:vLLM部署支持LoRA微调热更新能力说明 1. Qwen2.5-7B-Instruct模型核心能力解析 Qwen2.5-7B-Instruct是通义千问系列最新发布的指令微调语言模型,属于76亿参数规模的中型大模型。它不是简单地在前代基础上做参数堆叠&…

作者头像 李华