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

询问这两个sql语句的工作机理
语句1
select *
from sheet a ,sheet b
inner join c on c.yy = b.yy
where a.xx = b.xx
语句2
select *
from sheet a
inner join sheet b on b.xx = a.xx
inner join c on c.yy = b.yy
where a.xx = ...
问题1
语句1里 c join的到底是 a还是b 还是 a和b经过where得到的新表,是经过怎样的步骤才显示出最后的结果的?
问题2
哪个语句的花的时间会比较少?

我自己碰到了一个例子 就是用语句2 一个下午都没搜索结束 用了语句1全部数据在1个小时内搜索出来了。当然join的不仅仅只有一个c表。join的还有一个表d和表e。其中表e重复用了两次join。(因为取完数据再反查这个表里的内容,表sheet也是这个原因)

------解决方案--------------------
select *
from sheet a ,sheet b
inner join c on c.yy = b.yy
where a.xx = b.xx



select *
from sheet a ,sheet b
 c where c.yy = b.yy
and a.xx = b.xx

等价。
------解决方案--------------------
inner join只是外部可察看的连接方式,你可以通过“查询计划”查看内部查询计划,必要时也可自己修改hints来修改默认的查询方式,also see here:
http://www.cnblogs.com/downmoon/archive/2012/04/13/2445694.html
------解决方案--------------------
also see here,please:
http://blog.csdn.net/downmoon/article/details/7458203
------解决方案--------------------
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> 

我觉得这个问题有必要把MSSQL执行的顺序贴出来

------解决方案--------------------
1、 是a and b 交叉连接的虚拟表
2、on条件是在a和b形成的虚拟表上立马生效的,where是在所有的连接生效后的