|
我有一个员工表& 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中的示例。 |
|