初始的写法是这样的
select
t.OfficeSupplyID,
ApplyCount -IsNull(SupplyCount,0) as ApplyAccount
from @TB t left join (select * from Inventory ) i on t.OfficeSupplyID=i.OfficeSupplyID
where DomainAccount='lirz'
@TB里有十四条记录,Inventory 有17条记录可是执行的结果只有五条这显然不是left join所描述的那样,左边的表的记录全部被选中。很是疑惑。后来找到老大调试最后修改成如下方式
select
t.OfficeSupplyID,
ApplyCount -IsNull(SupplyCount,0) as ApplyAccount
from @TB t left join (select * from Inventory where DomainAccount='lirz') i on t.OfficeSupplyID=i.OfficeSupplyID
结果显示正常
可是一时也找不到第一种写法的错误在哪里。
后来通过显示全部的列发现只有五条记录的DomainAccount='lirz',这才恍然大悟,原来是联机查询的结果被where条件给过滤了。也就是说在做连接查询尤其是外联查询时首先应用的条件是连接,然后才是where条件,不同的where位置产生截然不同的结果。据老大说SqlServer有时候会优化查询条件就是先应用where条件过滤掉多余的记录然后再做链接,但是在外连接查询时候就不能做到如此优化了。
另外经验真是太重要了,尤其是在调试程序的时候,显得格外的高效!