news 2026/6/9 22:06:19

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/6/10 14:00:50

Clawdbot多模态扩展:LaTeX文档生成与Qwen3-32B集成

Clawdbot多模态扩展:LaTeX文档生成与Qwen3-32B集成 1. 科研写作的痛点与解决方案 科研人员每天都要面对大量的文档撰写工作——论文、报告、技术文档、项目申请书,这些文档不仅内容要求严谨,格式规范也极为严格。传统的工作流程通常是先在W…

作者头像 李华
网站建设 2026/6/10 14:00:54

CAD如何使用“面积总和“功能统计多个封闭图形面积?

在CAD制图中,快速获取多个区域的面积总和是优化工作流程的重要一步。如果仍依赖传统方法逐个查询并手工累加,无疑会消耗大量时间与精力。通过使用【面积总和】功能,你可以直接批量选择目标图形,系统将自动完成面积计算与汇总&…

作者头像 李华
网站建设 2026/6/10 14:00:57

YOLO X Layout开源大模型教程:使用HuggingFace Transformers加载ONNX模型推理

YOLO X Layout开源大模型教程:使用HuggingFace Transformers加载ONNX模型推理 1. 什么是YOLO X Layout文档理解模型 YOLO X Layout不是传统意义上的文本生成或对话模型,而是一个专为文档理解设计的视觉分析工具。它不读文字内容,而是“看懂…

作者头像 李华
网站建设 2026/6/10 14:01:18

Clawdbot+Qwen3-32B惊艳效果:支持Mermaid图表生成的技术方案设计实录

ClawdbotQwen3-32B惊艳效果:支持Mermaid图表生成的技术方案设计实录 1. 为什么Mermaid图表生成值得专门设计一套技术方案? 你有没有遇到过这样的场景:写技术文档时,想快速画一个流程图说明系统调用链,却要打开Visio、…

作者头像 李华