下面两个陈述之间有区别吗? - 逻辑上 - 性能(可能取决于真实系统(MySQL,Oracle,...)
select * from t1
join t2 on (t1.id=t2.id) and t1.id > 2
join t3 on (t2.id=t3.id) and t2.id > 4;
select * from t1
join t2 on (t1.id=t2.id)
join t3 on (t2.id=t3.id)
where t1.id > 2 and t2.id > 4;
答案 0 :(得分:0)
我使用订单在数百万条记录中运行此操作,但具有相同的前提:
过滤加入
select *
from dbo.Orders orders
INNER JOIN dbo.OrderItems orderItems ON orderItems.OrderID = orders.OrderID AND
orders.OrderDate > '01/01/2012'
过滤
select *
from dbo.Orders orders
INNER JOIN dbo.OrderItems orderItems ON orderItems.OrderID = orders.OrderID
where
orders.OrderDate > '01/01/2012'
<强>结论强>
执行计划完全相同。
<强>观察强>
两点:首先,这可能不会在所有情况下产生相同的执行计划。因此,正如其他人所提到的那样,你应该根据具体情况进行尝试。其次,我会使用“where”版本区分“加入”和“过滤”。一个操作是关于如何规范化数据的工件。 “过滤”组件是希望查看该数据的子集。所以我会在'where'子句中保留过滤连接数据集的内容。