SQL Server查询 - Where子句的最佳实践

时间:2014-07-04 15:39:14

标签: sql sql-server sql-server-2008

查看此查询:

Select 
    b.CodCred, 
    b.Codigo, 
    c.Nome 
from 
    AS_CredenciadosUsu a 
inner join 
    AS_Credenciados b on a.CodCred=b.CodCred 
inner join 
    Cadastro c on b.Codigo=c.Codigo 
Where 
    a.NumContrato = 21 and 
    b.NumContrato = 21 and 
    c.NumContrato = 21 and 
    a.CodUsuD = 1

我必须在这3个表中设置列NumContrato

最佳做法是在此查询中执行此操作吗?这对我来说只是看起来很脏,但我不知道如何做得更好或者是否有任何方法可以做得更好。

感谢。

2 个答案:

答案 0 :(得分:2)

如果NumContrato字段在所有三个表中实际相关,则看起来应该将NumContrato字段作为连接条件。

然后在您的WHERE子句中,您应该过滤 - 不加入 - 您只需指定一次条件。

Select b.CodCred, b.Codigo, c.Nome
  from AS_CredenciadosUsu a
 inner join AS_Credenciados b
    on a.CodCred = b.CodCred
   and a.NumContrato = b.NumContrato
 inner join Cadastro c
    on b.Codigo = c.Codigo
   and c.NumContrato = b.NumContrato
 Where a.NumContrato = 21
   and a.CodUsuD = 1

答案 1 :(得分:1)

这应该让引擎更好地工作,这也使您更容易阅读和维护:

Select 
    b.CodCred, 
    b.Codigo, 
    c.Nome 
from AS_CredenciadosUsu a 
join AS_Credenciados    b on a.NumContrato=b.NumContrato and a.CodCred=b.CodCred 
join Cadastro           c on b.NumContrato=c.NumContrato and b.Codigo=c.Codigo 
Where 
    a.NumContrato=21 and 
    a.CodUsuD=1

这样你就可以在b的join子句中将b链接到a的所有条件...在c ...的join子句中将c链接到b的所有条件以及WHERE子句中a的所有条件。常数(21和1)仅使用一次,如果需要,它们也可以更容易地用参数替换。