提示 (Transact-SQL) - 联接
适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例
联接提示用于指定查询优化器在 SQL Server 的两个表之间强制执行联接策略。 有关联接和联接语法的一般信息,请参阅 FROM (Transact-SQL)。
注意
由于 SQL Server 查询优化器通常会为查询选择最佳执行计划,因此我们建议仅在最后迫不得已的情况下才可由资深的开发人员和数据库管理员使用提示。
适用于
语法
<join_hint> ::=
{ LOOP | HASH | MERGE | REMOTE }
注意
若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档。
参数
LOOP | HASH | MERGE
指定查询中的联接应使用循环、哈希或合并。 使用 LOOP |HASH | MERGE JOIN 在两个表之间强制执行特定联接。 不能同时将 LOOP 与 RIGHT(或 FULL)指定为联接类型。 有关详细信息,请参阅联接。
REMOTE
指定联接操作在右表处执行。 这在左表是本地表而右表是远程表的情况下很有用。 只在左表的行数少于右表行数时才能使用 REMOTE。
如果右表为本地表,则联接在本地执行。 如果两个表均为远程表但来自不同的数据源,则 REMOTE 将使联接在右表处执行。 如果两个表均为远程表且来自相同数据源,则不需要使用 REMOTE。
如果使用 COLLATE 子句将联接谓词中比较的值中的一个值转换成了不同的排序规则,则不能使用 REMOTE。
REMOTE 只可用于 INNER JOIN 操作。
备注
联接提示在查询的 FROM 子句中指定。 联接提示可以在两个表之间强制执行联接策略。 如果为任意两个表指定了联接提示,查询优化器会根据 ON 关键字的位置,自动为查询中所有联接的表强制确定联接顺序。 如果使用了不带 ON 子句的 CROSS JOIN,则可使用括号指示联接顺序。
示例
A. 使用 HASH
下面的示例指定查询中的 JOIN
操作由 HASH
联接执行。 该示例使用 AdventureWorks2022 数据库。
SELECT p.Name, pr.ProductReviewID
FROM Production.Product AS p
LEFT OUTER HASH JOIN Production.ProductReview AS pr
ON p.ProductID = pr.ProductID
ORDER BY ProductReviewID DESC;
B. 使用 LOOP
下面的示例指定查询中的 JOIN
操作由 LOOP
联接执行。 该示例使用 AdventureWorks2022 数据库。
DELETE FROM Sales.SalesPersonQuotaHistory
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER LOOP JOIN Sales.SalesPerson AS sp
ON spqh.SalesPersonID = sp.SalesPersonID
WHERE sp.SalesYTD > 2500000.00;
GO
C. 使用 MERGE
下面的示例指定查询中的 JOIN
操作由 MERGE
联接执行。 该示例使用 AdventureWorks2022 数据库。
SELECT poh.PurchaseOrderID, poh.OrderDate, pod.ProductID, pod.DueDate, poh.VendorID
FROM Purchasing.PurchaseOrderHeader AS poh
INNER MERGE JOIN Purchasing.PurchaseOrderDetail AS pod
ON poh.PurchaseOrderID = pod.PurchaseOrderID;
GO
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈