这两个查询是否彼此不同?
查询一:
SELECT * FROM Table1, Table2 WHERE Table1.Id = Table2.RefId
查询 2:
SELECT * FROM Table1 INNER JOIN Table2 ON Table1.Id = Table2.RefId
我分析了这两种方法,它们显然产生了相同的实际执行计划。您是否知道使用内部联接会以更有效的方式工作的任何情况。使用内部联接而不是接近“查询 1”的方式的真正优势是什么?
这两个查询是否彼此不同?
查询一:
SELECT * FROM Table1, Table2 WHERE Table1.Id = Table2.RefId
查询 2:
SELECT * FROM Table1 INNER JOIN Table2 ON Table1.Id = Table2.RefId
我分析了这两种方法,它们显然产生了相同的实际执行计划。您是否知道使用内部联接会以更有效的方式工作的任何情况。使用内部联接而不是接近“查询 1”的方式的真正优势是什么?
您提供的两个语句在功能上彼此等效。
这种变化是由不同的 SQL 语法标准引起的。
对于真正令人兴奋的阅读,您可以通过访问以下 Wikipedia 链接来查找各种 SQL 标准。右侧是各种 SQL 方言/标准的参考和链接。
这些 SQL 语句是同义词,尽管指定 INNER JOIN 是首选方法并且遵循 ISO 格式。我也更喜欢它,因为它限制了从 where 子句连接表的管道,并使查询的目标更清晰。
这些将导致相同的查询计划,但首选 INNER JOIN、OUTER JOIN、CROSS JOIN 关键字,因为它们增加了代码的清晰度。
虽然您可以使用 FROM 子句中的关键字指定连接提示,但您可以在 WHERE 子句中执行更复杂的连接。但否则,查询计划将没有区别。
我还要补充一点,当查询变得复杂时,第一种语法更容易受到无意的交叉连接的影响。此外,此语法中的左连接和右连接在 SQL Server 中无法正常工作,因此永远不应使用。添加左连接时混合语法也会导致查询无法正确返回结果的问题。第一个示例中的语法已经过时了 17 年,我认为没有理由使用它。
Query 1 被认为是一种旧的语法风格,不鼓励使用它。使用该语法样式使用 LEFT 和 Right 连接时会遇到问题。同样在 SQL Server 上,在使用不同格式视图的查询中将这两种不同的样式混合在一起时可能会遇到问题。
我发现使用LEFT OUTER JOIN
S 并将条件放在ON
子句而不是WHERE
子句中的连接表上存在显着差异。一旦您在WHERE
子句中对连接表设置条件,您就击败了左外连接。
当我使用 Oracle 时,我在连接表之后使用了古老的 (+)(所有条件包括 WHERE 子句中的连接条件),因为这是我所知道的。当我们成为 SQL Server 商店时,我被迫使用LEFT OUTER JOIN
s,直到我发现这种行为,我才发现它们并没有像以前那样工作。这是一个例子:
select NC.*,
IsNull(F.STRING_VAL, 'NONE') as USER_ID,
CO.TOTAL_AMT_ORDERED
from customer_order CO
INNER JOIN VTG_CO_NET_CHANGE NC
ON NC.CUST_ORDER_ID=CO.ID
LEFT OUTER JOIN USER_DEF_FIELDS F
ON F.DOCUMENT_ID = CO.ID and
F.PROGRAM_ID='VMORDENT' and
F.ID='UDF-0000072' and
F.DOCUMENT_ID is not null
where NC.acct_year=2017