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

PostgreSQL中该JOIN查询为何报语法错误?MySQL中却合法

为什么PostgreSQL里不带ON的JOIN会报错,MySQL却允许?

这事儿核心在于PostgreSQL严格遵守SQL标准,而MySQL做了非标准的语法兼容扩展,咱们一步步说清楚:

  1. SQL标准的硬性要求
    标准SQL明确规定,所有显式的JOIN(比如INNER JOIN、LEFT JOIN这类)必须指定连接条件——要么用ON子句定义行匹配规则,要么用USING(列名)(当两张表有同名连接列时)。没有连接条件的显式JOIN属于语法违规,所以PostgreSQL直接抛出你看到的ERROR: Syntax error at the end of input。

  2. MySQL的非标准兼容逻辑
    MySQL为了兼容旧代码或者简化写法,做了个特殊扩展:允许省略ON子句的显式JOIN,这时候它会自动把这种语句当成**笛卡尔积(CROSS JOIN)**执行——也就是把第一张表的每一行和第二张表的每一行做全组合。但这是MySQL独有的行为,不是所有数据库都支持。

  3. 对应你的实际场景
    你原来的查询SELECT * FROM "addr_country" AS c JOIN "addr_state" AS s在PostgreSQL里报错,就是因为违反了标准语法;而加上ON c."id" = s."country" AND s.id = 10后,明确了合法的连接条件,符合标准规范,所以能正常运行。

    如果你确实需要笛卡尔积的效果,在PostgreSQL里应该显式写CROSS JOIN,比如:

    SELECT * FROM "addr_country" AS c CROSS JOIN "addr_state" AS s
    

    这样既符合SQL标准,也能得到和MySQL省略ON时一样的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:28:21