You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL多表连接时USING的行为及与ON的性能疑问

PostgreSQL中USING与ON的连接差异及多表USING行为解析

一、USING和ON的核心行为差异

  • 结果集字段合并:用USING(col)时,连接后的结果集里只会保留一个col字段(合并了两个表的对应字段);而用ON table1.col = table2.col时,结果集里会同时存在table1.col和table2.col两个字段,需要用别名或表限定符区分。
  • 语法适用范围:USING只能用于两个表中同名且数据类型可比较的字段,不能写复杂条件;ON则支持任意连接条件,比如ON table1.a = table2.b * 2或者多条件组合ON table1.x = table2.x AND table1.y < table2.y。
  • 空值匹配逻辑:两者完全一致——PostgreSQL中NULL = NULL不成立,所以只有当连接字段两边都是NULL时,USING和ON才会匹配这一行(如果需要把NULL视为相等,得用IS NOT DISTINCT FROM,不管是USING还是ON都要手动加这个逻辑)。

二、性能对比:无任何区别

USING本质就是ON table1.col = table2.col的语法糖,PostgreSQL的查询优化器会把这两种写法转换成完全相同的执行计划,底层执行逻辑、性能表现没有任何差异,只是结果集的字段展示不同。

三、多表连接时USING的执行逻辑

多表JOIN时,USING的匹配逻辑是基于当前连接的两个数据集的同名字段,每次JOIN后的中间结果会保留合并后的连接字段,后续JOIN会沿用这个中间结果的字段进行匹配。

场景1:table2同时包含k1和k2

执行语句:SELECT * FROM table1 JOIN table2 USING(k1) JOIN table3 USING(k2)

  1. 第一步table1 JOIN table2 USING(k1):合并两个表的k1字段,生成中间结果集T1。T1包含table1的非k1字段、table2的非k1字段,以及一个合并后的k1字段,同时保留table2的k2字段。
  2. 第二步T1 JOIN table3 USING(k2):用T1里的k2(来自原table2)和table3的k2匹配,合并k2字段,最终结果集里k2只出现一次,对应匹配成功的行。

场景2:table1同时包含k1和k2,table2只有k1

执行语句:SELECT * FROM table1 JOIN table2 USING(k1) JOIN table3 USING(k2)

  1. 第一步table1 JOIN table2 USING(k1):合并k1字段生成中间结果集T1,T1包含table1的非k1字段(包括k2)、table2的非k1字段,以及合并后的k1字段。
  2. 第二步T1 JOIN table3 USING(k2):用T1里的k2(来自原table1)和table3的k2匹配,合并k2字段,最终结果集里k2只出现一次,对应匹配成功的行。

注意:如果当前要JOIN的USING字段在中间结果集里不存在,PostgreSQL会直接抛出“字段不存在”的错误,比如如果table1和table2都没有k2,第二步JOIN就会报错。

内容的提问来源于stack exchange,提问作者Cody Ray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 03:47:49