因为您使用的是INNER JOIN,所以WHERE或JOIN辩论仅取决于您的品味和风格。就个人而言,我喜欢在ON子句中保留两个表之间的链接(例如,外键约束),而在WHERE子句中保留针对数据的实际过滤器。
sql Server会将查询解析为相同的令牌树,因此将构建相同的查询执行计划。
如果您使用的是[LEFT / RIGHT] OUTER JOINS,那么它会带来很大的不同,因为不仅性能可能不同,而且结果也很可能不同。
要回答您的其他问题:
什么时候最好过滤我的数据?
在WHERE或ON子句中,两者被视为相同。对于3,“ 第一个 内部联接”没有任何意义。在多表INNER JOIN场景中,哪个先行(在查询中)实际上并不重要,因为查询优化器将按其认为合适的顺序进行排序。
使用临时表完全没有必要,也无济于事,因为无论如何,您都必须提取相关部分-这也是JOIN也会做的。此外,如果在JOIN条件/ WHERE过滤器上具有良好的索引,则该索引将仅用于 访问 相关数据,而无需查看表的其余部分。