我知道SQL语句的执行顺序,但我仍然希望在SQL专家的帮助下确保一些事情。我有一个很大的SQL查询返回数千行。这是我编写的查询的最小化版本,并认为它是正确的。
Select *
from property
inner join tenant t on (t.hproperty = p.hmy **and p.hmy = 7**)
inner join commtenant ct on ct.htenant = t.hmyperson
where 1=1
我的同事说上面的查询相当于下面的查询性能(他对此非常有信心)
Select *
from property
inner join tenant t on (t.hproperty = p.hmy)
inner join commtenant ct on ct.htenant = t.hmyperson
where **p.hmy = 7**
有人可以帮我解释为什么上面的查询不等同或等同吗?感谢。
答案 0 :(得分:2)
如果您想知道两个查询是否相同,请了解如何查看SQL Server Management Studio中的执行计划。您可以将两个查询放在不同的窗口中,查看估计的执行计划,并查看它们是否相同。
在这种情况下,它们可能是相同的。 SQL旨在成为描述性语言,而不是过程语言。也就是说,它描述了您想要的输出,但允许SQL引擎重写查询以尽可能高效。您描述的两种形式的输出相同。请注意,如果有left outer join
而不是inner join
,则查询会有所不同。
很可能,引擎会在读取或期间读取表并过滤记录,并使用索引进行读取。但关键的想法是输出是相同的,SQL Server可以识别这一点。
答案 1 :(得分:0)
“p.hmy = 7”不是连接条件,因为它只涉及单个表。因此,它实际上并不属于连接的ON子句。由于您没有通过将条件放在ON子句中来添加任何信息,因此将它放在WHERE子句(它确实属于它)中将不会对生成的查询计划产生任何影响。如有疑问,请查看查询计划。