这两条SQL语句在性能或功能上有什么不同吗?

这两条SQL语句在性能或功能上有什么不同吗?,sql,sql-server,Sql,Sql Server,目前我正在维护其他人的SQL,我在一个存储过程中遇到了这个问题: SELECT Location.ID, Location.Location, COUNT(Person.ID) As CountAdultMales FROM Transactions INNER JOIN Location ON Transactions.FKLocationID = Location.ID INNER JOIN Per

目前我正在维护其他人的SQL,我在一个存储过程中遇到了这个问题:

    SELECT      
    Location.ID, 
    Location.Location, 
    COUNT(Person.ID) As CountAdultMales
FROM        
    Transactions INNER JOIN 
    Location ON Transactions.FKLocationID = Location.ID INNER JOIN  
    Person ON Transactions.FKPersonID = Person.ID 
     AND DATEDIFF(YEAR, Person.DateOfBirth, GETDATE()) >= 18 AND Person.Gender = 1
WHERE
    ((Transactions.Deleted = 0) AND
    (Person.Deleted = 0) AND
    (Location.Deleted = 0))
上面的内容和这个(我会这样写)有什么不同吗

就我个人而言,我觉得把条件放在WHERE子句中最容易阅读,但我想知道是否有性能或其他原因来“条件化”(如果有这样一个词)连接


感谢提供了
内部连接
,这并没有多大区别,因为SQL有一个查询优化程序,它将尽最大努力以最有效的方式执行查询(不是完美的)


如果这是一个
外部连接
,那么它可能会有所不同,因此需要注意这一点

这取决于您使用的是哪个数据库。一般来说,DB内部优化器会解决这个问题


请看这里:

两个查询的性能相同。内部联接没有区别。

在您的示例中,性能是相同的,但是您可以通过以下方式对其进行调整:

SELECT      
Location.ID, 
Location.Location, 
COUNT(Person.ID) As CountAdultMales
FROM        
Transactions 
INNER JOIN Location 
ON Transactions.FKLocationID = Location.ID 
INNER JOIN Person 
ON Transactions.FKPersonID = Person.ID 
WHERE
Transactions.Deleted = 0 AND
Person.Deleted = 0 AND
Location.Deleted = 0 AND 
Person.DateOfBirth < dateadd(year, datediff(year, 0, getdate())-17, 0) AND 
Person.Gender = 1
选择
Location.ID,
地点,地点,
将(Person.ID)计数为成年男性
从…起
交易
内连接位置
ON Transactions.FKLocationID=Location.ID
内部连接人
ON Transactions.FKPersonID=Person.ID
哪里
事务处理。已删除=0和
Person.Deleted=0和
Location.Deleted=0和
Person.DateOfBirth
这样,您就不会对所有列进行计算以获得年份。相反,您只需将年份与更快的静态值进行比较


此查询选择的是在当前年份结束之前年满18岁(或更老)的行。

不要担心这里的执行计划,正如成员们已经说过的,他们应该生成相同的执行计划。这就是问题本身

如果代码的可读性和维护太早,或者几乎不可能进行优化,那么您应该担心代码的可读性和维护


这应该是一个连接条件还是一个过滤器?从代码本身来看,我认为它是过滤器的一部分。

在我的SQL Server 2008R2上,生成的执行计划是相同的。不要忘记接受答案,还有其他问题,当问题得到回答时,我会回答,t-clausen.dk!
SELECT      
Location.ID, 
Location.Location, 
COUNT(Person.ID) As CountAdultMales
FROM        
Transactions 
INNER JOIN Location 
ON Transactions.FKLocationID = Location.ID 
INNER JOIN Person 
ON Transactions.FKPersonID = Person.ID 
WHERE
Transactions.Deleted = 0 AND
Person.Deleted = 0 AND
Location.Deleted = 0 AND 
Person.DateOfBirth < dateadd(year, datediff(year, 0, getdate())-17, 0) AND 
Person.Gender = 1