JOIN表达能力远比你想的强大--postgresql/lightdb a [left/right] join b on true的含义
最近遇到个示例
Table A join table B ON TRUE
以及外连接
Table A LEFT outer join table B on TRUE
在非外连接中,JOIN ON TRUE相当于CROSS JOIN,CROSS关键字可选(CROSS JOIN后不能用ON),相当于笛卡尔乘积,生成m x n行结果,如果n没有记录,则返回0行。
而在外关联中则不同,返回整个左侧表中的记录,如下:
CREATE TABLE a (i INT); CREATE TABLE b (i INT); INSERT INTO a VALUES (1),(2),(3); SELECT a.i, b.i FROM a LEFT JOIN b ON TRUE ;
除此之外,外连接可以直接用括号()指定关联顺序关系,且保留主表,这是一直以来没有发现的。如下:
postgres=# SELECT a.i, x.i,x.xi FROM a LEFT JOIN (select x.i as xi,c.i as i from b as x LEFT JOIN c on true) x ON TRUE ; i | i | xi ---+---+---- 1 | 4 | 4 1 | 5 | 4 2 | 4 | 4 2 | 5 | 4 3 | 4 | 4 3 | 5 | 4 (6 rows) postgres=# SELECT a.i, x.i FROM a LEFT JOIN (b as x LEFT JOIN c on true) x ON TRUE ; ERROR: column reference "i" is ambiguous LINE 1: SELECT a.i, x.i FROM a LEFT JOIN (b as x LEFT JOIN c on true...
postgres=# SELECT * FROM a LEFT JOIN (b as x LEFT JOIN c on true) x ON TRUE ; i | i | i ---+---+--- 1 | 4 | 4 1 | 4 | 5 2 | 4 | 4 2 | 4 | 5 3 | 4 | 4 3 | 4 | 5 (6 rows)
不明确指定的情况下,()外连接可以返回所有外连接的字段。和普通的外连接一样。
注:在postgresql中,所有的右外连接都会被先转换为左外连接,以减少一种优化处理。
对于外关联而言,nullable-side是一个非常重要的点(指的是不匹配时返回空的那些表),涉及到for update和优化的适用性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2018-12-04 ORA-12801/ORA-12853: insufficient memory for PX buffers: current 274880K, max needed 19722240K/ORA-04031解决方法
2018-12-04 关于oracle result_cache
2016-12-04 2016年12月数据库流行度排行榜
2016-12-04 excel查看VBA代码快捷键