31

我想知道是否CROSS JOIN可以在找到任何查询时安全地替换INNER JOIN它。

INNER JOIN没有ON还是USING完全一样CROSS JOIN?如果是,是否CROSS JOIN发明了该类型只是为了在查询中更好地表达意图?

这个问题的附录是:

CROSS JOIN ... WHERE x使用, INNER JOIN ... ON ( x )或时使用现代和广泛使用的 DBMS 会有区别INNER JOIN ... WHERE ( x )吗?

谢谢你。

4

2 回答 2

28

在所有现代数据库中,所有这些结构都针对相同的计划进行了优化。

某些数据库(如SQL Server)在 之后需要一个ON条件INNER JOIN,因此您的第三个查询不会在那里解析。

表的可见范围是按JOIN顺序排列的,所以这个查询:

SELECT  *
FROM    s1
JOIN    s2
ON      s1.id IN (s2.id, s3.id)
CROSS JOIN
        s3

不会解析,而这个:

SELECT  *
FROM    s2
CROSS JOIN
        s3
JOIN    s1
ON      s1.id IN (s2.id, s3.id)

将要。

于 2011-04-21T09:36:57.053 回答
2

原始交叉连接是一种没有 where 子句的交叉连接,这意味着为要连接的左右表的每个组合生成一条记录,并在没有左侧或右侧数据的地方插入空值。

如果您将 where 子句添加到交叉连接,这将使其等同于内部连接,因为 where 子句与内部连接中的 ON 执行相同的操作。

但是,内部连接通常更好用,因为它可以将 ON 条件与其余的 where 子句分开,从而更容易理解。

于 2011-04-21T09:46:21.663 回答