【问题标题】:Is this really a cross join? [duplicate]这真的是交叉连接吗? [复制]
【发布时间】:2018-10-04 04:01:34
【问题描述】:

我正在检查由 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 生成的,但这个应用程序支持几个数据库供应商?我可以期望大多数数据库以相同的方式处理此查询吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这真的是“交叉连接”吗?

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

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

    【讨论】:

      猜你喜欢
      • 2016-03-09
      • 2022-01-12
      • 1970-01-01
      • 2015-10-18
      • 2017-10-26
      • 2013-05-01
      • 1970-01-01
      • 2011-03-14
      • 2013-02-25
      相关资源
      最近更新 更多