日期:2014-05-18  浏览次数:20560 次

请教关于关联子查询的问题
先看一段代码
 
SQL code
select soh1.CustomerID,soh1.SalesOrderID,soh1.OrderDate
from Sales.SalesOrderHeader soh1
where soh1.OrderDate=(
    select MIN(soh2.OrderDate)
        from Sales.SalesOrderHeader soh2
        where soh2.CustomerID=soh1.CustomerID
)
order by CustomerID


现在的问题是我想知道它在执行的时候顺序是怎么执行的?
这篇文章说了sql的执行顺序 http://www.cnblogs.com/summer_adai/archive/2011/10/28/2227605.html

我现在的疑惑是当执行到where 条件时,where条件里又是一条sql语句
SQL code
select MIN(soh2.OrderDate)
        from Sales.SalesOrderHeader soh2
        where soh2.CustomerID=soh1.CustomerID

,那么它又会按照链接那篇文章所说的执行顺序执行吗? 如果按照链接的文章中的顺序执行,当执行到where条件时,它会怎么处理?跳到父查询?感觉像死循环似的 。还是遍历父查询的记录?  
望高手指点

------解决方案--------------------
SQL code


SQL Select语句完整的执行顺序: 

1、from子句组装来自不同数据源的数据; 
2、where子句基于指定的条件对记录行进行筛选; 
3、group by子句将数据划分为多个分组; 
4、使用聚集函数进行计算; 
5、使用having子句筛选分组; 
6、计算所有的表达式; 
7、使用order by对结果集进行排序。 


另外:一个查询语句各个部分的执行顺序: 
--8)  SELECT (9) DISTINCT (11) <TOP_specification> <select_list> 
--(1)  FROM <left_table> 
--(3)    <join_type> JOIN <right_table> 
--(2)      ON <join_condition> 
--(4)  WHERE <where_condition> 
--(5)  GROUP BY <group_by_list> 
--(6)  WITH {CUBE | ROLLUP} 
--(7)  HAVING <having_condition> 
--(10) ORDER BY <order_by_list>

------解决方案--------------------
死循环不会,但是效率肯定低了:父查询涉及的表的每条记录,都需要执行一个子查询
一直不喜欢这种“乱伦”的查询,理解略麻烦,效率更成问题