语句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也是这个原因)

解决方案 »

  1.   

    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等价。
      

  2.   

    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等价。F大仙说的
      

  3.   

    inner join只是外部可察看的连接方式,你可以通过“查询计划”查看内部查询计划,必要时也可自己修改hints来修改默认的查询方式,also see here:
    http://www.cnblogs.com/downmoon/archive/2012/04/13/2445694.html
      

  4.   

    also see here,please:
    http://blog.csdn.net/downmoon/article/details/7458203
      

  5.   

    问题1
    语句1里 c join的到底是 a还是b 还是 a和b经过where得到的新表,是经过怎样的步骤才显示出最后的结果的?等价的意思是它和语句2所经历的步骤是一样的嘛?
    问题2
    既然是等价。那条件都是一样的。索引会针对where和join进行不同的优化?问题1是优先回答 问题2可以不回答。
      

  6.   


    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执行的顺序贴出来
      

  7.   

    谢谢提点。但是奇怪在语句1明显笛卡尔乘积,而inner join不会形成笛卡尔乘积。反而后者花的时间长。
    所以我提问了如下问题:
    语句1里 c join的到底是 a还是b 还是 a和b经过where得到的新表,是经过怎样的步骤才显示出最后的结果的?等价的意思是它和语句2所经历的步骤是一样的嘛?(这个问题有助于分析清楚 语句一是在自连接后再INNER JOIN c 还是   b先经过inner join c后的 再和a一起from
    有没有索引的问题就略过吧。因为这个sql语句很简单。所以把索引的效果忽略掉吧
      

  8.   


    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
    inner join c on c.yy = b.yy
    and a.xx = b.xx
      

  9.   

    问题来了,语句1中from里有两张表a,b,那c join的是a还是b还是a和b的自连接(虽然a和b在我的语句里是同一张表)?(引用中可看出where的执行在on的后面,但是from在on的前面,所以c join的是a和b的自连接还是有可能的)求指教
      

  10.   

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

  11.   


    语句1 一张交叉表连接了C连接了D连接了E搜索+导出 1个小时
    语句2 A连接了B连接了C连接了D连接了E搜索一个下午都没能搜索完。。
    由于A和B是同一张表。。
    怎么都想不通。。搜索时间上的差距这么大,交叉表明显比连接的表的内容要多,但搜索时间的长短却是反过来的。SQL语句这么简单不应该归结于索引的问题?