SqlServer之连接
在sql server中,我们经常能用到连接,今天总结一下连接的基础知识。
以下通过例子来了解各个连接的异同点: 有两张表Teacher表和Course表: 交叉连接: 1.如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积; select * from Course cross join Teacher 结果为: 由此结果可知,它的结果与 SELECT * FROM Course,Teacher 的结果相同。 2.如果有WHERE子句的话,往往会先生成两个表行数乘积的数据表然后才根据WHERE条件从中选择。 1. select * from Course,Teacher where Course.T#=Teacher.T# 2. select * from Course cross join Teacher where Course.T#=Teacher.T# (注:cross join后加条件只能用where,不能用on) 3. select * from Course inner join Teacher on Course.T#=Teacher.T# 结果为: 一般情况下,在效率上,Where可能具有和Inner?join一样的效率,但是,在多表连接时,我们并不推荐使用where语句。 内连接 内连接表示两边表同时符合条件的组合,就相当于普通的CROSS JOIN,只是格式不一样, 外连接 指定条件的内连接,仅仅返回符合连接条件的条目。 select * from Course left outer join Teacher on Course.T#=Teacher.T# 结果为: 2)右外连接RIGHT [OUTER] JOIN select * from Course right outer join Teacher on Course.T#=Teacher.T#结果为: 3)全外连接full [outer] join 显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集。 select * from Course full outer join Teacher on Course.T#=Teacher.T# 结果为: 自连接 其实,在Sql Server中,我们还经常用到一种连接——自连接。 解决问题: 树形层次结构显示 自连接的方法1: select [Name] as '地区名',(select [Name] from tb_TestTreeView as a where a.ID = b.Parent ) as '上级地区名' from tb_TestTreeView as b 自连接的方法2: select a.[Name] as '地区名',b.[Name] as '上级地区名' from tb_TestTreeView as a left join tb_TestTreeView as b on a.Parent = b.ID 结果为: 自连接三级(左联接): select a.[Name] as '地区名',b.[Name] as '上级地区名',c.[Name] as '上上级地区名' from tb_TestTreeView as a left join tb_TestTreeView as b on a.Parent = b.ID left join tb_TestTreeView as c on b.parent=c.id 结果为: 自连接三级(内联接): select a.[Name] as '地区名',c.[Name] as '上上级地区名' from tb_TestTreeView as a inner join tb_TestTreeView as b on a.Parent = b.ID inner join tb_TestTreeView as c on b.parent=c.id 结果为: 自连接四级(左链接): select a.[Name] as '地区名',c.[Name] as '上上级地区名',d.[Name] as '上上上级地区名' from tb_TestTreeView as a left join tb_TestTreeView as b on a.Parent = b.ID left join tb_TestTreeView as c on b.parent=c.id left join tb_TestTreeView as d on c.parent=d.id 结果为: 自连接四级(内链接): select a.[Name] as '地区名',d.[Name] as '上上上级地区名' from tb_TestTreeView as a inner join tb_TestTreeView as b on a.Parent = b.ID inner join tb_TestTreeView as c on b.Parent = c.ID inner join tb_TestTreeView as d on c.Parent = d.ID 结果为: 本文转载自http://www.cnblogs.com/jiajiayuan/archive/2012/01/16/2321385.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |