这真的是一个交叉加入吗?

时间:2018-04-24 02:08:06

标签: mysql sql

我正在检查由Java ORM工具(Hibernate)生成的SQL,并遇到了这个奇怪的查询。它最初因为CROSS JOIN而脱颖而出。但它似乎也在WHERE子句中使用ANSI-89 JOIN语法。

SELECT max(c.item)
FROM ItemPubStatus c 
   CROSS JOIN TargetSystemPub t 
   CROSS JOIN Item m 
WHERE c.targetsystempublication = t.id 
   AND c.canonicalitem = m.id 
   AND t.targetsystem = ?
   AND m.datapool = ?
   AND m.itemtype = ?
  1. 考虑到WHERE子句中的连接,这真的是一个CROSS JOIN,它会产生一个笛卡尔积吗?
  2. 虽然这个SQL是为MySQL生成的,但这个应用程序支持多个数据库供应商?我可以期望大多数数据库以同样的方式处理此查询吗?

1 个答案:

答案 0 :(得分:2)

这真的是一个"交叉加入"?

这个问题毫无意义。 SQL不是一种过程语言。 SQL查询描述了处理中的结果,而不是处理的完成方式。

WHERE子句描述了对表的完整笛卡尔积的过滤。过滤等同于等连接。语法不是表达查询的最佳方式。但几乎所有的查询优化器(包括MySQL)都会以比生成笛卡尔积和过滤结果更合理的方式实现它。