日期:2014-05-17  浏览次数:20522 次

T-SQL,请问联表查询中的执行顺序
联表查询SQL如下

SELECT  WOO.BillID 
,WOO.ID
,WOO.CallNumber
,WOO.OrderType
,WOO.OrderSubType
,WOO.DataSource
,WOO.WorkOrderCreateTime
,WOO.StaffCode
,ISNULL(CAST(QI.Total AS NCHAR),'未质检') AS Total
,ISNULL(CAST(QI.SecondTotal AS NCHAR),'未质检') AS SecondTotal
,QI.Pass
,QI.SubTime 
FROM
(
SELECT WO.BillID
,WO.ID
,WO.CallNumber
,OT.[Type] AS OrderType
,OST.[Type] AS OrderSubType
,WO.DataSource
,WO.WorkOrderCreateTime
,WO.StaffCode
FROM WorkOrderTwoFit WO
LEFT JOIN OrderType OT ON WO.OrderType = OT.ID 
LEFT JOIN OrderType OST ON WO.OrderSubType = OST.ID
WHERE WO.DataSource = '电话'
AND WO.StaffCode = (SELECT StaffCode FROM StaffBaseInfo WHERE StaffID = @StaffID)
AND WO.WorkOrderCreateTime >= @SDATE AND WO.WorkOrderCreateTime < @EDATE 
)WOO
LEFT JOIN
(
SELECT StaffCode 
,Total
,SecondTotal
,Pass
,SubTime
FROM QuaInfo
)QI
ON WOO.StaffCode = QI.StaffCode

此联表查询中还嵌有子联表查询,
所以想知道它的执行顺序。

是否是先查出WOO中的数据,
然后查询出QI中的数据,
最后再WOO与QI联表查询?

------解决方案--------------------
从逻辑上来说,先从最内层查起,但是经过优化,可能顺序不一样,最直接的方法是打开实际执行计划,然后运行查询,再看执行计划的顺序
------解决方案--------------------
逻辑上的顺序像你说的那样。

实际上的执行顺序, 要看查询计划, 
就这条语句来说,可能跟逻辑顺序一致,
也可能会按照 select a.* ,...., from wo left join b on .. left join c on ... left join.... 这样的顺序来, 即把qi并到左面的子查询里。


------解决方案--------------------
这语句可以把好多子查询去掉,最后一个qi也没必要用子查询
------解决方案--------------------
这个没必要用子查询吧,能用关联查询的尽量关联查询
------解决方案--------------------
就针对你这个语句,基本上是像你说的。

由于你内部有的是left join,然后最后是woo与QI也是left join,所以先是内部的WOO中的数据,然后查询出QI中的数据,最后再WOO与QI联表查询。

另外,你的语句还是适当的简化,比如最后left join QI 就没必要再写个子查询,直接:

left join QuaInfo QI
       ON ON WOO.StaffCode = QI.StaffCode


就可以了