繁体   English   中英

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

[英]How to filter rows with WHERE clause before JOIN?

我有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进行联接,而不对整个表进行联接,那将会更好。

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

除了使用优化器提示外,您无法指定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查找适当的订单,然后获取适当的产品行。

在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'

要么

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM