表结构:
表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) 但一般不建议使用。
------解决方案--------------------
这要看表结构和查询语句,一般说来连接效率要高一些.
对这个语句而言,谁先连接谁后连接你根本用不着去管它,那是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>