我想知道为什么在SQL Server的ON子句中没有等号=的情况下无法完成合并联接

问题描述

我最近正在研究sql Server。我读了一本书,说合并联接在sql Server的ON子句中至少需要一个等号(=)。

所以,我在下面尝试了此查询,发现发生了错误

SELECT  * 
FROM    TABLE_1 AS T1 
        INNER MERGE JOIN TABLE_2 AS T2 
        ON T1.COL_1 > T2.COL_2

错误消息:

消息8622,级别16,状态1,第6行查询处理器无法产生 查询计划,因为此查询中定义了提示。重新提交 查询而无需指定任何提示,也无需使用SET FORCEPLAN。

这本书还说,在完全外部联接的情况下可以做到这一点。 因此,我在下面尝试了此查询,发现它已成功提交,没有错误

SELECT  * 
FROM    TABLE_1 AS T1 
        FULL OUTER MERGE JOIN TABLE_2 AS T2 
        ON T1.COL_1 > T2.COL_2

我试图搜索原因,但是找不到任何解释。

谁能告诉我为什么sql Server除非没有完全的外部联接,否则不允许没有等号运算符的合并联接?

感谢您阅读我的问题

解决方法

您使用了内部合并联接。 Merge子句是一个连接提示,它告诉sql引擎更有效地工作。

合并联接具有最快的算法,因为每行仅需要从源输入中读取一次。另外,在其他联接运算符中进行的优化可以在特定条件下为这些运算符提供更好的性能。

如果必须使用'>'运算符,请使用常规内部联接

SELECT  * 
FROM    TABLE_1 AS T1 
        INNER JOIN TABLE_2 AS T2 
        ON T1.COL_1 > T2.COL_2