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/6 16:18:23

fft npainting lama vs 传统修图,谁更快更准?

FFT NPainting LaMa vs 传统修图,谁更快更准? 在图像处理领域,移除图片中不需要的物体、擦除水印或修复瑕疵,一直是设计师和内容创作者的高频需求。过去,我们依赖Photoshop的“内容识别填充”、仿制图章或修补工具——…

作者头像 李华
网站建设 2026/6/5 23:04:15

ms-swift日志分析技巧:从输出中获取关键信息

ms-swift日志分析技巧:从输出中获取关键信息 在使用ms-swift进行大模型微调、强化学习或推理部署时,控制台输出的日志远不止是运行状态的简单反馈。这些看似杂乱的文本流中,隐藏着训练稳定性、资源使用效率、收敛质量乃至潜在问题的关键线索…

作者头像 李华
网站建设 2026/6/6 1:59:40

从入门到精通:QAnything PDF解析器完整使用手册

从入门到精通:QAnything PDF解析器完整使用手册 1. 快速上手:三步启动你的PDF解析服务 你是否还在为处理大量PDF文档而头疼?手动复制粘贴效率低,OCR识别准确率差,表格提取格式混乱……这些问题,QAnything…

作者头像 李华
网站建设 2026/6/6 16:27:36

Clawdbot代码生成:基于模板的自动化开发辅助

Clawdbot代码生成:基于模板的自动化开发辅助 1. 引言:当代码生成遇上模板引擎 想象一下这样的场景:凌晨两点,你正在为一个重复的后端接口编写相似的CRUD代码,手指机械地敲击着键盘,心里默默计算着还要熬多…

作者头像 李华
网站建设 2026/6/9 6:42:39

Pi0效果展示:‘拿起红色方块’指令在光照变化下的鲁棒性测试集

Pi0效果展示:‘拿起红色方块’指令在光照变化下的鲁棒性测试集 1. 什么是Pi0?——一个能“看懂”指令的机器人控制模型 你有没有想过,让机器人真正听懂人话是什么体验?不是预设好几十个固定动作,而是你随口说一句“把…

作者头像 李华