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

DELETE中多inner join 的一点疑问
表结构:

表College      

 CollegeID,CollegeName

表Major          

 MajorID,MajorName,CollegeID

表Class                

ClassID,ClassName,MajorID

表 StudentInfo      

 ClassID ……(其余省略)

现在要根据CollegeID来删除对应的 College,Major,Class,StudentInfo

我写的SQL

delete  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的执行顺序是怎样的?

------解决方案--------------------

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

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

------解决方案--------------------
引用:
那看来还是要子查询啊
子查询效率和join效率啊有大差别?

这要看表结构和查询语句,一般说来连接效率要高一些.
对这个语句而言,谁先连接谁后连接你根本用不着去管它,那是DBMS的事情,我们没必要什么都搞得清清楚楚.
------解决方案--------------------
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=?)

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