【问题标题】:Is CROSS JOIN a synonym for INNER JOIN without ON clause?CROSS JOIN 是没有 ON 子句的 INNER JOIN 的同义词吗?
【发布时间】:2011-08-10 04:13:27
【问题描述】:

我想知道CROSS JOIN 是否可以在任何查询中安全地替换为INNER JOIN

没有ONUSINGINNER JOIN 是否与CROSS JOIN 完全相同?如果是,是否发明了 CROSS JOIN 类型只是为了在查询中更好地表达意图?

这个问题的附录是:

在使用CROSS JOIN ... WHERE xINNER JOIN ... ON ( x )INNER JOIN ... WHERE ( x ) 时,使用现代和广泛使用的 DBMS 会有什么不同吗?

谢谢。

【问题讨论】:

    标签: sql inner-join cross-join


    【解决方案1】:

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

    某些数据库(如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)
    

    会的。

    【讨论】:

    • 感谢您的回答。根据INNER JOINs 的标准,ON 条件是强制性的吗?
    • @Benoit:根据SQL-92,它不是。不过,我手边没有20032008 的副本。除了MySQL 之外的所有数据库都需要它。
    • @Benoit:我的意思是“四大的所有数据库”,抱歉 :)
    • @Quassnoi:这是指 Oracle、MySQL、PostgreSQL 和 SQL Server 吗?
    • 在第二个版本的查询中,我认为您的意思是“FROM s2”。它不会按原样解析。可以说值得一票(这不是我的),但它很容易解决。
    【解决方案2】:

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

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

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

    【讨论】:

    • 在您的第一段中,您混淆了 CROSS 和 OUTER 连接。与空表交叉连接会产生空结果。
    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 2010-11-04
    • 2013-07-19
    • 2014-06-23
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多