where子句的最佳实践

时间:2013-05-14 10:20:38

标签: sql sql-server-2008

假设我有一个包含以下字段的合同Contract表:ContractIdProductIDProductType。在相同ContractId的表格中,我有两个ProductID。所有表格都填充了两个ProductTypeType1Type2

以一种方式或另一种方式执行以下查询的原因是什么?

方式1:

 select c1.ProductID, c2.ProductID
 from Contract as c1 left join Contract as c2 on c1.ContractId=c2.ContractId
 where c1.ProductType <>'Type2'

方式2:

 select c1.ProductID, c2.ProductID
 from Contract as c1 left join Contract as c2 on c1.ContractId=c2.ContractId
 where c1.ContractId not in (select ContractId from Contract where ProductType = 'Type2') 

感谢您的明智答案!

2 个答案:

答案 0 :(得分:4)

方式1更容易阅读,更容易让数据库引擎进行优化。

答案 1 :(得分:1)

查询#2使用子查询,性能将比查询#1慢,后者只是检查条件而无需从表中进一步获取。