SQLserver 自交叉连接于常用场景
2018-02-25 22:32
295 查看
SQL server自交叉连接可以联结同一个表的多个实例,此功能称为自联结,并被所有基本联结类型支持(交叉联结、内部联结和外部联结)。例如,一下代码在Employees表的两个实例间执行一个自联结。
select
E1.empid,E1.firstname,E1.lastname,
E2.empid,E2.firstname,E2.lastname
from HR.Employees as E1
CROSS JOIN HR.Employees AS E2;
此查询会生成雇员配对的所有可能组合。由于Employees表中有9行,此处查询返回81行。
其实实际运用场景当中,大多数是用于组成树,最常见的就是部门树,一般来说部门树的结构会是这个样子。
create table department
(
id int primary key identity,
name nvarchar(50),
lastid int
)
如果我想查出一棵部门树的话如何用自交叉联结来完成呢,用以下SQL就好,sqlserver当中也可以用cte来完成,mysql的话我暂时是用下面这种方式。
select d1.id,d2.name,d1.name as lastname from department d1,
cross join department d2
where d1.id = d2.lastid
如果要查某一个部门id的子树加一个id=”的条件就好了,如果要查下级部门树的话把d1,d2顺序对调一下即可。
select
E1.empid,E1.firstname,E1.lastname,
E2.empid,E2.firstname,E2.lastname
from HR.Employees as E1
CROSS JOIN HR.Employees AS E2;
此查询会生成雇员配对的所有可能组合。由于Employees表中有9行,此处查询返回81行。
其实实际运用场景当中,大多数是用于组成树,最常见的就是部门树,一般来说部门树的结构会是这个样子。
create table department
(
id int primary key identity,
name nvarchar(50),
lastid int
)
如果我想查出一棵部门树的话如何用自交叉联结来完成呢,用以下SQL就好,sqlserver当中也可以用cte来完成,mysql的话我暂时是用下面这种方式。
select d1.id,d2.name,d1.name as lastname from department d1,
cross join department d2
where d1.id = d2.lastid
如果要查某一个部门id的子树加一个id=”的条件就好了,如果要查下级部门树的话把d1,d2顺序对调一下即可。
相关文章推荐
- JDBC常用连接写法(包括MySQL、Oracle、Sybase、SQLServer、DB2)
- JDBC常用连接写法(包括MySQL、Oracle、Sybase、SQLServer、DB2)
- 常用数据连接写法 oracle db2 sqlserver
- QT unixODBC+freetds连接sqlserver并交叉编译移植到ARM上
- JDBC常用连接写法(包括MySQL、Oracle、Sybase、SQLServer、DB2)
- JDBC常用连接写法(包括MySQL、Oracle、Sybase、SQLServer、DB2)
- JDBC常用连接写法(包括MySQL、Oracle、Sybase、SQLServer、DB2)
- 收藏:JDBC常用连接写法(包括MySQL、Oracle、Sybase、SQLServer、DB2)
- JDBC常用连接写法(包括MySQL、Oracle、Sybase、SQLServer、DB2)
- 常用的连接字符串(vs中连接sqlserver)方便随时查看
- 收藏:JDBC常用连接写法(包括MySQL、Oracle、Sybase、SQLServer、DB2)
- VS2005中几个常用的数据库连接字段(odbc ,oledb,SqlServer)记录
- SQLSERVER交叉连接
- jdbc的配置及jdbc连接常用数据库(mysql、sqlserver、Oracle)
- ASP常用数据库连接及操作的方法和技巧
- sqlserver 左连接的写法
- MySQL,SQLServer,Oracle数据库常用字段类型
- SQLServer和Oracle常用函数对比
- 常用设计模式的应用场景
- 连接虚拟机的SQLServer