表结构:表College       CollegeID,CollegeName表Major           MajorID,MajorName,CollegeID表Class                ClassID,ClassName,MajorID表 StudentInfo       ClassID ……(其余省略)现在要根据CollegeID来删除对应的 College,Major,Class,StudentInfo我写的SQLdelete  from StudentInfo from StudentInfo
inner join Class on Class.ClassID=StudentInfo.ClassID 
inner join Major on Major.MajorID=Class.MajorID
where Major.CollegeID=?
放心不下 想研究下这句SQL的逻辑执行顺序
各种百度 gg
http://blog.csdn.net/feixianxxx/archive/2009/10/18/4694354.aspx里面说到 它做的就是要将FROM最前面2表进行CROSS JOIN(因为可能多表)那我想问我这句SQL一开始时候是哪两个表先cross join?这句SQL的执行顺序是怎样的?

解决方案 »

  1.   


    --StudentInfo,Class 先join啊,按照你join的顺序依次执行
      

  2.   

    delete from StudentInfo 
    where StudentInfo.ClassID 
    in (select classid from Class A,major B where A.classid = B.majorid and B.major.collegeid?)
      

  3.   

    使用连接的时候如果不指定option(force order),优化器会根据成本确定访问表的顺序。
      

  4.   


    更加不懂了 = =
    option(force order)
      

  5.   

    一般是按你写的顺序 join ,但是如果在很多join的情况下,系统可能自动选择优化的进行join可能先后面join再前面的join.
    如果你想要按自己的顺序join可以加上 option (force order) 但一般不建议使用。
      

  6.   

    那看来还是要子查询啊
    子查询效率和join效率啊有大差别?
      

  7.   

    这要看表结构和查询语句,一般说来连接效率要高一些.
    对这个语句而言,谁先连接谁后连接你根本用不着去管它,那是DBMS的事情,我们没必要什么都搞得清清楚楚.
      

  8.   

    delete StudentInfo from StudentInfo where exists(
    select 1 from  Class
    inner join Major on Major.MajorID=Class.MajorID
    where Class.ClassID=StudentInfo.ClassID  and Major.CollegeID=?)
      

  9.   

    条件联接包含3个或者更多的表时,内联接的运算是最优先的;其它联接按顺序进行分析:先分析出最先出现的两个表的联接结果,然后以这个结果集作为一个独立的对象,与下一个表进行条件联接,直到分析完所有的表。
    [邹建][深入浅出SQL Server 2005 开发,管理与应用实例]<Page100>
      

  10.   

    delete from XXX inner XX 最终执行的是所有满足条件的记录都删除,还是某个(些)表中满足条件的记录?