树形结构的存储与查询

数据库设计中常常会遇到需要存储树形结构,比如员工关系表、组织结构表,等等。

点击(此处)折叠或打开

  1. --测试数据

  2. CREATE TABLE #Employees(
  3.     EmployeeCode varchar(20) NOT NULL PRIMARY KEY CLUSTERED,
  4.     ReportToCode varchar(20) NULL)
  5. GO
  6. INSERT INTO #Employees VALUES(\'A\',NULL)
  7. INSERT INTO #Employees VALUES(\'B\',\'A\')
  8. INSERT INTO #Employees VALUES(\'C\',\'A\')
  9. INSERT INTO #Employees VALUES(\'D\',\'A\')
  10. INSERT INTO #Employees VALUES(\'E\',\'B\')
  11. INSERT INTO #Employees VALUES(\'F\',\'B\')
  12. INSERT INTO #Employees VALUES(\'G\',\'C\')
  13. INSERT INTO #Employees VALUES(\'H\',\'D\')
  14. INSERT INTO #Employees VALUES(\'I\',\'D\')
  15. INSERT INTO #Employees VALUES(\'J\',\'D\')
  16. INSERT INTO #Employees VALUES(\'K\',\'J\')
  17. INSERT INTO #Employees VALUES(\'L\',\'J\')
  18. INSERT INTO #Employees VALUES(\'M\',\'J\')
  19. INSERT INTO #Employees VALUES(\'N\',\'K\')
  20. GO
  21. /*
  22. 可能遇到的查询问题:
  23. 1. 员工\'D\'的所有直接下属
  24. 2. 员工\'D\'的所有2级以内的下属(包括直接下属和直接下属的下属)
  25. 3. 员工\'N\'的所有上级(按报告线顺序列出)
  26. 4. 员工@EmployeeCode的所有@LevelDown级以内的下属(@EmployeeCode和@LevelDown以变量传入)
  27. DECLARE @EmployeeCode varchar(20), @LevelDown int;
  28. SET @EmployeeCode = \'D\';
  29. SET @LevelDown = 2;
  30. 5. 员工@EmployeeCode的所有@LevelUp级以内的上级(@EmployeeCode和@LevelUp以变量传入)
  31. DECLARE @EmployeeCode varchar(20), @LevelUp int;
  32. SET @EmployeeCode = \'N\';
  33. SET @LevelUp = 2;
  34. */
  35. --用递归CTE实现员工树形关系表

  36. WITH CTE AS(
  37.     SELECT
  38.         EmployeeCode,
  39.         ReportToCode,
  40.         ReportToDepth = 0,
  41.         ReportToPath = CAST(\'/\' + EmployeeCode + \'/\' AS varchar(200))
  42.     FROM #Employees
  43.     WHERE ReportToCode IS NULL
  44.     UNION ALL
  45.     SELECT
  46.         e.EmployeeCode,
  47.         e.ReportToCode,
  48.         ReportToDepth = mgr.ReportToDepth + 1,
  49.         ReportToPath = CAST(mgr.ReportToPath + e.EmployeeCode + \'/\' AS varchar(200))
  50.     FROM #Employees e
  51.     INNER JOIN CTE mgr
  52.     ON e.ReportToCode = mgr.EmployeeCode
  53. )
  54. SELECT * FROM CTE ORDER BY ReportToPath

http://bbs.csdn.net/topics/340078327

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22392018/viewspace-1068778/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22392018/viewspace-1068778/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值