我正在检查由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 = ?
答案 0 :(得分:2)
这真的是一个"交叉加入"?
这个问题毫无意义。 SQL不是一种过程语言。 SQL查询描述了处理中的结果,而不是处理的完成方式。
WHERE
子句描述了对表的完整笛卡尔积的过滤。过滤等同于等连接。语法不是表达查询的最佳方式。但几乎所有的查询优化器(包括MySQL)都会以比生成笛卡尔积和过滤结果更合理的方式实现它。