DELETE中多inner join 的一点疑问

alan_219_2008 2011-02-10 07:16:37
表结构:

表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的执行顺序是怎样的?
...全文
542 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dai215shu 2013-10-15
  • 打赏
  • 举报
回复
delete from XXX inner XX 最终执行的是所有满足条件的记录都删除,还是某个(些)表中满足条件的记录?
Shawn 2011-02-14
  • 打赏
  • 举报
回复
条件联接包含3个或者更多的表时,内联接的运算是最优先的;其它联接按顺序进行分析:先分析出最先出现的两个表的联接结果,然后以这个结果集作为一个独立的对象,与下一个表进行条件联接,直到分析完所有的表。
[邹建][深入浅出SQL Server 2005 开发,管理与应用实例]<Page100>
alan_219_2008 2011-02-14
  • 打赏
  • 举报
回复
看来没人来啊
alan_219_2008 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 abuying 的回复:]

SQL code
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=?)
[/Quote]


这几种写法有啥区别?
abuying 2011-02-12
  • 打赏
  • 举报
回复
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=?)
alan_219_2008 2011-02-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qianjin036a 的回复:]

引用 9 楼 alan_219_2008 的回复:
那看来还是要子查询啊
子查询效率和join效率啊有大差别?

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

我怕连接顺序错了会导致 删除错误
-晴天 2011-02-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 alan_219_2008 的回复:]
那看来还是要子查询啊
子查询效率和join效率啊有大差别?
[/Quote]
这要看表结构和查询语句,一般说来连接效率要高一些.
对这个语句而言,谁先连接谁后连接你根本用不着去管它,那是DBMS的事情,我们没必要什么都搞得清清楚楚.
alan_219_2008 2011-02-10
  • 打赏
  • 举报
回复
那看来还是要子查询啊
子查询效率和join效率啊有大差别?
gw6328 2011-02-10
  • 打赏
  • 举报
回复
5楼。
gw6328 2011-02-10
  • 打赏
  • 举报
回复
一般是按你写的顺序 join ,但是如果在很多join的情况下,系统可能自动选择优化的进行join可能先后面join再前面的join.
如果你想要按自己的顺序join可以加上 option (force order) 但一般不建议使用。
alan_219_2008 2011-02-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dlut_liuq 的回复:]

引用 4 楼 alan_219_2008 的回复:
引用 2 楼 dlut_liuq 的回复:

ctrl+L看下执行计划

不怎么看的懂。。

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

更加不懂了 = =
option(force order)
飘零一叶 2011-02-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 alan_219_2008 的回复:]
引用 2 楼 dlut_liuq 的回复:

ctrl+L看下执行计划

不怎么看的懂。。
[/Quote]
使用连接的时候如果不指定option(force order),优化器会根据成本确定访问表的顺序。
alan_219_2008 2011-02-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dlut_liuq 的回复:]

ctrl+L看下执行计划
[/Quote]
不怎么看的懂。。
rucypli 2011-02-10
  • 打赏
  • 举报
回复
delete from StudentInfo 
where StudentInfo.ClassID
in (select classid from Class A,major B where A.classid = B.majorid and B.major.collegeid?)
飘零一叶 2011-02-10
  • 打赏
  • 举报
回复
ctrl+L看下执行计划
快溜 2011-02-10
  • 打赏
  • 举报
回复

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

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧