数据库查询中无JOIN子句的third_table表如何参与关联?
关于混合显式JOIN与逗号分隔表的SQL语法解释
这种写法其实是旧式SQL的隐式交叉连接语法,早于INNER JOIN这类显式关键字出现,本质是把逗号等价成了CROSS JOIN(笛卡尔积),但和显式JOIN混合时要注意优先级问题:
数据库会先处理所有显式的
INNER JOIN(以及LEFT/RIGHT JOIN)逻辑,再把得到的结果集和逗号列出的表做笛卡尔积。比如你看到的查询:SELECT * FROM source_table INNER JOIN other_table ON source_table.id = other_table.source_id, third_table;实际会被数据库解析成:
SELECT * FROM (source_table INNER JOIN other_table ON source_table.id = other_table.source_id) CROSS JOIN third_table;也就是先把source_table和other_table按ON条件关联,再把这个结果的每一行和third_table的所有行配对,生成所有可能的组合。
你在熟悉的数据库里跑不通,大概率是因为现代数据库要么默认禁用了这种混合写法(比如PostgreSQL 9.1+、开启严格模式的MySQL 5.7+),要么对语法合规性要求更高——这种混合写法可读性极差,很容易写出逻辑错误,早就不符合ANSI SQL的现代规范了。
这种写法的风险也很明显:如果third_table数据量大,笛卡尔积会直接让结果集爆炸,性能暴跌;而且表之间的关联逻辑全靠读者脑补,维护起来简直是灾难。
内容的提问来源于stack exchange,提问作者simplycoding
相关产品推荐
相关产品推荐

