我有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
?
答案 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