[英]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.