树形结构部门的 sqlserver 排序

因为要实现部门排序功能,而且要考虑部门的层级,直接用 sql 排序是不行的,所以写个 sql function 来支持。 
首先部门表:company

CREATE TABLE company(
CompanyId id NOT NULL,
CompanyName nvarchar(115) NOT NULL

记录部门层级结构的表,如果部门没有上级部门则在这张表中不会有记录

CREATE TABLE company_report(
CompanyId id NOT NULL,
ReportToId id NOT NULL,
DisplayOrd ord CONSTRAINT [DF1_company_report] DEFAULT (1) NOT NULL
)

在 company_report 中 ReportToId 是指上级部门的 CompanyId 。 
像这种树形结构,在代码中一般都是用递归来遍历了,但是在 sql 中实现递归还是很麻烦的,还是写成循环简单点。 
定义 function :

go
if (exists (select * from sys.objects where name = 'get_company_report_name_fn'))
drop FUNCTION get_company_report_name_fn
go
CREATE FUNCTION get_company_report_name_fn (@i_vCompanyId id, @i_vCompanyName string2)
RETURNS string2
AS
BEGIN
DECLARE @t_vResult string2;
DECLARE @t_vReportToId id; SET @t_vResult = '';
--父部门ID
SET @t_vReportToId = 0;
--拼接父部门Name
SELECT @t_vResult = r.CompanyName + '_' + c.CompanyName,
@t_vReportToId = cr.ReportToId
FROM company_report cr, company c, company r
WHERE cr.CompanyId = c.CompanyId
AND cr.ReportToId = r.CompanyId
AND cr.CompanyId = @i_vCompanyId
--while 父部门还存在父部门
while (
exists(select cr.ReportToId from company_report cr where cr.CompanyId = @t_vReportToId)
)
begin
SELECT @t_vResult = r.CompanyName + '_'+ @t_vResult,
@t_vReportToId = cr.ReportToId
FROM company_report cr, company c, company r
WHERE cr.CompanyId = c.CompanyId
AND cr.ReportToId = r.CompanyId
AND cr.CompanyId = @t_vReportToId
end
--已经是最顶层的部门了 返回原值
if @t_vResult = ''
begin
SET @t_vResult = @i_vCompanyName
end return @t_vResult
END
GO

原理就是在子部门的 name 上加上父部门的 name 用 _ 符号连接,如果父部门还存在父部门则继续连接下去。 
在排序的时候这样调用:

select dbo.get_company_report_name_fn(companyId, companyName) from company order by dbo.get_company_report_name_fn(companyId, companyName)

结果:

ula-client01 LTD.
ula-client01 LTD._ula-client02
ula-client01 LTD._ula-client02_ula-client02-子
ula-client01 LTD._ula-client03
Sony
Sony_Hair
Sony_Hair_IBM

写完给 Leader 看看,他觉得我写复杂了,然后就随手改了下:

go
if (exists (select * from sys.objects where name = 'get_company_report_name_fn'))
drop FUNCTION get_company_report_name_fn
go
CREATE FUNCTION get_company_report_name_fn (@i_vCompanyId id, @i_vCompanyName string2)
RETURNS string2
AS
BEGIN
DECLARE @t_vResult string2;
DECLARE @t_vReportToId id;
DECLARE @t_vReportToName string2; SET @t_vResult = @i_vCompanyName;
SET @t_vReportToId = @i_vCompanyId; while (exists(select cr.ReportToId from company_report cr where cr.CompanyId = @t_vReportToId))
begin
SELECT @t_vReportToId = cr.ReportToId, @t_vReportToName = c.companyName
FROM company_report cr, company c
WHERE cr.ReportToId = c.CompanyId
AND cr.CompanyId = @t_vReportToId;
set @t_vResult = @t_vReportToName + '_' + @t_vResult;
end return @t_vResult;
END
go

好吧,是简单了很多。主要是消除了重复的代码。 
END。

树形结构部门的 sqlserver 排序的更多相关文章

  1. YbSoftwareFactory 代码生成插件【十八】:树形结构下的查询排序的数据库设计

    树形结构的排序在中国特色下十分普遍也非常重要,例如常说的五大班子,党委>人大>政府>政协>纪委,每个班子下还有部门,岗位,人员,最终排列的顺序通常需要按权力大小.重要性等进行排 ...

  2. 部门树形结构,使用Treeview控件显示部门

    部门树形结构.设计张部门表用于存储部门编码.名称.上级部门id,使用Treeview控件显示部门树,并实现部门增删改.移动.折叠等功能.特别提示,部门有层级关系,可用donetbar的adtree控件 ...

  3. js文章列表的树形结构输出

    文章表设计成这样了 后端直接给了无任何处理的json数据,现在要前端实现树形结构的输出,其实后端处理更简单写,不过既然来了就码出来 var doclist = [{ "id": 1 ...

  4. C# EasyUI树形结构权限管理模块

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本节和大家探讨下C#使用EasyUI树形结构/Tree构 ...

  5. Java创建树形结构算法实例

    在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构. 首先是需要的JavaBe ...

  6. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  7. MongoDB五种树形结构表示法

    MongoDB五种树形结构表示法 第一种:父链接结构 db.categories.insert( { _id: "MongoDB", parent: "Databases ...

  8. Android - N级树形结构实现

    目前已经实现3级之内的任意级树形结构展示(如果想增加更多级,需要扩展排序算法),并支持单选和多选(使用不同的适配器). 实现使用的控件:ListView 首先,最重要的应该是数据源的格式,支持树形结构 ...

  9. 关于mysql中数据存储复合树形结构,查询时结果按树形结构输出

    1.主要思想:根据已有数据,规则性的造数据 select * FROM(select lId,strName,lId as lParentId,-1 as orderIdx from tbClassi ...

随机推荐

  1. 【Permutations】cpp

    题目: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the fo ...

  2. Netsharp快速入门(之10) 销售管理(插件、资源、业务建模)

    作者:秋时 杨昶   时间:2014-02-15  转载须说明出处 第4章     销售模块开发 4.1     创建插件和资源 参考基础档案的开发 4.2     创建业务模型 Netsharp工具 ...

  3. Linux 配置网络

    1.vi  /etc/sysconfig/network-scripts/ifcfg-eth0 2. # Advanced Micro Devices [AMD] 79c970 [PCnet32 LA ...

  4. codechef 两题

    前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...

  5. Mac下使用Apache TCPMon

    Mac下使用Apache TCPMon 参考链接: TCPMon Tutorial Anyone know how to get TCPMON working on a mac? Apache TCP ...

  6. 使用命令行编译、打包、运行WordCount--不用eclipse

    1)首先创建WordCount1023文件夹,然后在此目录下使用编辑器,例如vim编写WordCount源文件,并保存为WordCount.java文件 /** * Licensed under th ...

  7. python 安装 管理包 pip

    2.7的坑里出不来了,现在已经换到3.4了,不存在下列问题. win7下安装pip    http://blog.chinaunix.net/uid-24984661-id-4202194.html ...

  8. POJ 2081

    #include <iostream> #define MAXN 500005 using namespace std; //unsigned _m[MAXN]; ]; int main( ...

  9. Android线程消息通信(二)

    创建线程消息队列 Android应用程序的消息队列是使用一个MessageQueue对象来描述的,它可以通过调用Looper类的静态成员函数prepareMainLooper或者prepare来创建, ...

  10. windows JDK 版本切换

    windows JDK 版本切换1. HKEY_LOCAL_MACHINE“SOFTWARE“JavaSoft“Java Runtime Environment“CurrentVersion, 把这个 ...