如何在JOIN之前使用WHERE子句过滤行?

时间:2019-07-06 14:40:51

标签: sql sql-server database tsql

我有2张桌子,如下所示:

订购

Id, Name

产品

Id, OrderId, ...

我想按特定的订单名称过滤所有产品。我的T-SQL查询:

SELECT o.Id, o.Name, p.Id
FROM Order o
INNER JOIN Product p ON o.Id = p.OrderId
WHERE o.Name = "TEST"

我的产品表可以包含数千行,因此我相信此SQL首先将所有产品的所有订单联接在一起,然后使所有联接的结果集都应用WHERE子句以仅选择具有TEST名称的产品。

如果SQL首先通过名称“ TEST”过滤Order表,然后仅对那些Order而不是整个表进行联接,将会更好。

所以问题是如何在WHERE之前执行JOIN

2 个答案:

答案 0 :(得分:3)

除非使用优化器提示,否则您不能指定如何 SQL运行查询。标准SQL查询仅指定结果是什么,而不指定执行计划。通常,您需要依靠优化器来选择最佳的执行计划。

对于此查询:

SELECT o.Id, o.Name, p.Id
FROM Orders o INNER JOIN
     Product p
     ON o.Id = p.OrderId
WHERE o.Name = 'TEST'

为了提高性能,您希望在Orders(Name, Id)Product(Orderid, p.Id)上建立索引。这为优化器提供了寻找最佳执行计划所需的工具。

这些覆盖了查询的索引,这意味着所有列都在索引中,因此不需要检索数据页。执行计划应基于Name查找适当的订单,然后获取适当的产品行。

答案 1 :(得分:0)

在Join部分中用其他条件替换where语句

类似的东西

SELECT o.Id, o.Name, p.Id
FROM Order o
INNER JOIN Product p ON o.Id = p.OrderId
AND o.Name = 'TEST'

OR

SELECT o.Id, o.Name, p.Id
FROM (SELECT x.Id, x.Name Order x WHERE x.Name = 'Test') o
INNER JOIN Product p ON o.Id = p.OrderId