--题目:如下面, 求出所有顶级下的子级(仅子级,不含再下一级),要求是子级或者子级的下面不包含学校 --顶级 ------处长室 ------------科长室0 ------------科长室1 ------宣传部 ------科苑小学 ------初中部 ------------兰州中学 ------高中部 ------------兰州高中 --1. 创建部门表及测试数据 IF OBJECT_ID('Dep') IS NOT NULL BEGIN DROP TABLE Dep END GO CREATE TABLE Dep( id INT, pId INT, [name] VARCHAR(200), isSchool BIT /*是否为学校*/ ) GO INSERT INTO Dep SELECT 1,0,'顶级',0 union SELECT 2,1,'处长室',0 union SELECT 3,2,'科长室0',0 union SELECT 4,2,'科长室1',0 union SELECT 5,1,'宣传部',0 union SELECT 6,1,'科苑小学',1 union SELECT 7,1,'初中部',0 union SELECT 8,7,'兰州中学',1 union SELECT 9,1,'高中部',1 union SELECT 10,9,'兰州高中',0 --SELECT * FROM Dep d --2. 创建查询所有子级单位的函数 IF OBJECT_ID('fn_getSubDep') IS NOT NULL BEGIN DROP FUNCTION dbo.fn_getSubDep END GO CREATE FUNCTION fn_getSubDep( @depId INT ) RETURNS TABLE AS RETURN( WITH cte(id,pId,NAME,isSchool, level) AS ( SELECT id,pid,NAME,isSchool, 0 FROM Dep d WHERE id=@depId UNION ALL SELECT d2.id,d2.pid,d2.NAME,d2.isSchool, cte.[level]+1 FROM Dep d2 JOIN cte ON d2.pid = cte.id ) SELECT * FROM cte ) GO --SELECT * FROM dbo.fn_getSubDep(2) --3. 求出所有顶级下的子级(仅子级,不含再下一级),要求是子级或者子级的下面不包含学校 WITH cte(id,pId,NAME,isSchool) AS ( SELECT id,pId,NAME,isSchool FROM dbo.fn_getSubDep(1) t1 WHERE LEVEL=1 AND isSchool=0 AND NOT EXISTS( SELECT 1 FROM dbo.fn_getSubDep(t1.id) WHERE isSchool=1 ) ) SELECT * FROM cte
用公共表表达式完成一些对特殊部门的操作
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:Ubuntu Linux自动发邮件配置及邮件发送脚本
下一篇:QtWebKit
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
常用的一些正则表达式
常用正则表达式正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表
正则表达式 字符串 浮点数 -
迭代 列表表达式
迭代
迭代 -
表表达式
表表达式是一种命名的查询表达式,代表一个有效的关系表。可以像其他表一样,在数据处理语句中使用表表达式。Microsoft SQL Server支持4种类型的表表达式:派生表(Derived table)、公用表表达式(CTE, common table expression)、视图(Views),以及内联表值函数(inline TVF, inline table-valued function)。再加上今天看书,书中有提及,有关表表达式如何有效定义任何类型的表表达式,查询语句必须满足三个要求:1. 不保证有一定的顺序。表表达式代表的是一个表,而关系表中的行是没有固定的顺序的。2. 所有的列必须
sql TABLE Derived Table CTE Views