回答

收藏

获取所有直接或间接向员工报告的员工,层次结构级别为

技术问答 技术问答 209 人阅读 | 0 人回复 | 2023-09-14

我有一个员工表& v: H& S( k+ x  {% G
emp_id bigint,8 d4 I' I3 z% G4 S2 ]2 M# q
reports_to bigint,
3 e1 u1 O$ j6 T. U& h8 w0 V9 iemp_name varchar(20),
8 A, k4 g; Z" M2 A0 E9 IConstraint [PK_Emp] Primary key (emp_id),1 D. f5 G) M. \4 \% V2 G
Constraint [FK_Emp] Foreign key (reports_to) references [MSS].[dbo].[Emp]([emp_id])
5 J/ @) q5 d6 ^( }emp_id         reports_to        emp_name4 e" D8 b0 z, n* n! d
------         ------       --------------: M: K4 \3 q% S) M4 E8 z
1              null         Sumanta
$ u- Q7 S3 x5 X2 I2              1            Arpita: P/ C" m) g* ]) s  o3 o
3              null         Pradip/ }5 C6 D9 u  f/ ?
4              1            Sujon
! Q+ u0 d1 x5 A. w- d9 A6 ^5              2            Arpan
0 U& N! E" y) L3 A$ g6              5            Jayanti
  O! O; `. B/ K& {/ e& `6 ~我想让所有直接或间接向Sumanta或emp_id(1)报告并具有层次结构级别的员工,如下所示:
: Z2 l# \) u4 K3 A  Hemp_id         hierarchy_level         emp_name0 s% Y3 m3 S* V) p: b" v# C
------         ---------------        ----------
4 M  D7 N$ E* L0 Q3 L4 G" B. T2                    1                  Arpita- L1 a3 [1 @% n* e2 X0 A0 S; F. T0 E
4                    1                  Sujon
/ c% S9 w7 B9 U/ P$ D& i, _2 ]5                    2                  Arpan
% f% ~- J6 C& T/ W6                    3                 Jayanti
+ s# M7 O5 E. G& O( o) H+ ^; n# G9 K我是SQL的新手,只是找不到使用什么或如何获得这些结果。是否值得使用具有表值变量的存储过程,或者仅使用Tsql选择查询就足够了。任何帮助都是最欢迎的。
8 X4 o9 k9 r8 A我所做的就是-
6 ]7 K8 C' r4 @/ Z* ]Select Ep.emp_id,ep.emp_eame 7 m3 b' A: n0 T8 h2 R+ ~0 E
From Emp as E ' J: T, @, r; N& s' M
Inner Join Emp as Ep on Ep.reports_to=E.Emp_id
; B+ R$ ~5 f/ {/ S6 j* G0 s7 kWhere E.reports_to=1 or E.emp_id=1;$ t0 d) a+ w$ A- c" h( l3 K( \$ p
但这是准确的,直到2级,我什至无法生成hierarchy_level。任何建议,想法............将是最有帮助的............3 X% f. H6 r4 q" z( ~! T
                8 }1 S& e6 g8 l. A: T4 z) x/ d0 `
解决方案:
; Z! T* N0 Z. ~  a3 d               
- @! D, y2 s/ _' ]- G
/ r1 I2 q% J0 k/ c/ H, Q3 p) f  F" C" r3 ?% P+ V) u7 A) M
                您可以使用递归CTE:
) k* e5 c  E+ y; V8 Z  R& d; with  CTE as 2 E) i# L# g% U8 W" M$ G
        (: G, \: R$ |# a. f  F3 B% E) L3 k
        select  emp_id5 F: h: h6 e& ^, Z, n* ^! Q
        ,       reports_to
7 C$ q! C" f, D" @        ,       emp_name/ @! l1 O0 L! ^& Q
        ,       1 as level
' o6 D& K8 r& D9 O& a        from    Emp$ {9 k; c1 _3 p+ p: D
        where   emp_name = 'Sumanta'
$ {) R: }4 A7 X/ E        union all( z$ @7 q9 [$ M$ }. V. h/ ^
        select  child.emp_id
& |" B4 Y; ~5 s, ^" G5 t        ,       child.reports_to1 P$ n. `6 Q4 |
        ,       child.emp_name: J, k& t* E7 e" P7 M1 _3 \' `
        ,       level + 1# `. U8 T% @1 g* w
        from    Emp child
' w  B: G5 E6 z' N4 s$ Y/ g, W        join    CTE parent
! W3 ^. @8 s! p. S        on      child.reports_to = parent.emp_id
& J; C0 f) D/ }        )
' i/ A; O) @. i! |* O- Aselect  *
4 R* @5 I" h, k) o3 ?from    CTE5 @% q  k1 z( C1 N  W! V: v
SQL Fiddle中的示例。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则