PostgreSQL中该JOIN查询为何报语法错误?MySQL中却合法
为什么PostgreSQL里不带ON的JOIN会报错,MySQL却允许?
这事儿核心在于PostgreSQL严格遵守SQL标准,而MySQL做了非标准的语法兼容扩展,咱们一步步说清楚:
SQL标准的硬性要求
标准SQL明确规定,所有显式的JOIN(比如INNER JOIN、LEFT JOIN这类)必须指定连接条件——要么用ON子句定义行匹配规则,要么用USING(列名)(当两张表有同名连接列时)。没有连接条件的显式JOIN属于语法违规,所以PostgreSQL直接抛出你看到的ERROR: Syntax error at the end of input。MySQL的非标准兼容逻辑
MySQL为了兼容旧代码或者简化写法,做了个特殊扩展:允许省略ON子句的显式JOIN,这时候它会自动把这种语句当成**笛卡尔积(CROSS JOIN)**执行——也就是把第一张表的每一行和第二张表的每一行做全组合。但这是MySQL独有的行为,不是所有数据库都支持。对应你的实际场景
你原来的查询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
相关产品推荐
相关产品推荐

