zoukankan      html  css  js  c++  java
  • SQL笔记

    前一篇文章中已经可以取得所有部门的全称,但现在又有个新的需求: 只想得到某一个部门的部门全称,虽然可以用where条件来过滤,但是会有点小浪费。 这时我们可以从后往前找,先看下效果:

    最后一条就是,行得通! 但是怎么取出来呢? 用ParentUnitID排序? 但是实际生活中,部门可能调整或归并,并不总是 UnitID > ParentUnitID. 所以需要一个类似于 标识列的参照物:

     1 Declare @utid int
     2 Set @utid = 10        -- the target unit
     3 ;
     4 With CTE_Unit_Name_Special        -- test: show the full name of every Unit
     5 as(
     6     select UnitID, 
     7             --UnitName, 
     8             Cast(UnitName as nvarchar(max)) as UnitName,
     9             ParentUnitID,
    10             0 as IndexTemp        -- identity
    11         from Unit
    12         where UnitID = @utid
    13     Union All    -- Essential
    14     select U.UnitID, 
    15             (
    16                 U.UnitName + '/' + CU.UnitName
    17             ) as UnitName, 
    18             U.ParentUnitID,
    19             (CU.IndexTemp + 1) as IndexTemp
    20         from Unit as U
    21             Inner Join CTE_Unit_Name_Special as CU
    22             on U.UnitID = CU.ParentUnitID
    23         where U.ParentUnitID != 0    
    24 )
    25 --select * from CTE_Unit_Name_Special
    26 select top 1 * from CTE_Unit_Name_Special
    27     --order by ParentUnitID asc    -- only the situation where PUTID < UTID is suited
    28     order by IndexTemp desc    -- need a reference substance, like a Identity column

    结果不用再显示了。。。 等等,刚想起来,部门表中有个列UnitLevel是标识部门父子层次关系的,不管部门怎么调整,这个层次还是有顺序的, 可以直接用, 一样的。。。。

    顺便捎带个以前写的一个函数:

     1 -- Function - get a full unit name of one special unit
     2 Create Function FN_GetFullUnitName(@unitID int)
     3 Returns nvarchar(1000)
     4 as
     5 Begin
     6     Declare @fullName nvarchar(1000),
     7             @level smallint,
     8             @parentUTID int
     9     select @fullName = UnitName,
    10            @parentUTID = ParentUnitID,
    11            @level = UnitLevel
    12     from Unit
    13     where UnitID = @unitID
    14     
    15     if @level <= 2
    16         return @fullName
    17     
    18     while @level > 2
    19     Begin
    20         Set @unitID = @parentUTID
    21         select @fullName = UnitName + '/' + @fullName,
    22                @parentUTID = ParentUnitID,
    23                @level = UnitLevel
    24         from Unit
    25         where UnitID = @unitID
    26     End    
    27     return @fullName
    28 End
    29 go
    30 --Drop Function FN_GetFullUnitName
    31 --select dbo.FN_GetFullUnitName(10)  -- 销售部/售后科/客服部
  • 相关阅读:
    WPF 使用 Direct2D1 画图 绘制基本图形
    WPF 使用 Direct2D1 画图 绘制基本图形
    dot net core 使用 IPC 进程通信
    dot net core 使用 IPC 进程通信
    win2d 图片水印
    win2d 图片水印
    Java实现 LeetCode 240 搜索二维矩阵 II(二)
    PHP closedir() 函数
    PHP chroot() 函数
    PHP chdir() 函数
  • 原文地址:https://www.cnblogs.com/ccding13/p/3515423.html
Copyright © 2011-2022 走看看