选择同一表关系中的所有父级或子级SQL Server
技术问答
196 人阅读
|
0 人回复
|
2023-09-14
|
SQL开发人员,我有一个计划不周的数据库作为任务,以学习有关SQL Server 2012的很多知识。' A! X! d J5 _, r( S5 u# U* p
所以,有表Elem:
8 {% q Y! ?) n3 \" s( H+ D3 l+-----------+----+---+----------+------------+- X; d V9 j9 ^5 s. g! G
|VERSION(PK)|NAME|KEY|PARENT_KEY|DIST_KEY(FK)|
0 c: J4 I- J5 `( {+-----------+----+---+----------+------------+. W9 G: _ V2 I* [# a# {: Z% y: S4 g- j3 s
|1 |a |12 |NULL |1 |
9 }8 `1 N/ j; F0 g1 w! Z; F7 n+-----------+----+---+----------+------------+
7 `- Q: W! H8 L5 P" G0 H|2 |b |13 |12 |1 |! ~+ v# M% R1 o1 q1 O
+-----------+----+---+----------+------------+7 z, i d0 Q/ o8 S% i
|3 |c |14 |13 |1 |' ? y7 s- S- N! }/ D( h0 U
+-----------+----+---+----------+------------+
. |1 ]( X$ v/ `- A" ]$ h# c|4 |d |15 |12 |1 |
2 ?$ B6 ]) L( }; S4 [+-----------+----+---+----------+------------+8 g4 z% w8 U$ e0 N$ O$ p
|5 |e |16 |NULL |1 |+ E3 a5 v# \1 T
+-----------+----+---+----------+------------+
. T; S# z& j; i|6 |e |17 |NULL |2 |
; [: o, V% D+ Z+ q+-----------+----+---+----------+------------+
* c( h4 s/ V5 l更新该行后,我需要检查element的父键,以不允许element自anny之类。
6 q) ~# h) ?7 Y8 f当我删除该行时,我需要删除所有孩子以及孩子的孩子,等等。
, f7 g/ ]- [+ ~$ u: Q问题是:
3 e. }! ?/ C+ g[ol]. }; k- w$ N7 c. p. k
如何选择DIST的一个元素的所有“父母+祖父母+等等”?
X( z1 l( T9 \- H" T; c b# W3 d! r2 L; @" f+ ~
我如何选择DIST元素中的所有“儿子+孙子+等”?
2 s% g b( c, T: W2 B- U: R% b- N$ U. ]- [$ V
[/ol]$ j3 ^7 q& t7 }7 J" c; ~
我读过有关使用CTE的解决方案的信息,但是我没有任何基础,甚至无法理解那时如何使用CTE。- c: s2 J2 ~3 [ X- u* w/ `/ Y
请帮忙!
- Y9 M5 T) |6 L! z7 p谢谢。- ~, _' l1 d0 g( A" }+ N7 d# V2 Y
. r) f4 i6 w% j) X; ^
解决方案:) G3 X/ i- o3 F% _% x2 U! C) |' [
% a4 P$ \4 H: n& S7 X# F# t
, p' w% d3 p+ ~7 z# o
! ~% `; ?0 U$ g% e+ \8 t0 [
我已经遇到了这个问题by通过这种方式解决了问题
0 M3 V' e5 S, I. F8 N- G --all "parent + grandparent + etc" @childID Replaced with the ID you need
4 A$ s8 X5 g& g" U, A6 U/ c! wwith tbParent as. M! j* ?0 b, a0 S$ w, r" U$ e
(
- v" K) H7 f1 Z' [4 ^6 g" R f# g" V select * from Elem where [KEY]=@childID( k( A6 Z2 x) s2 c
union all
: r+ d, p5 [" n8 S" z. x# L select Elem.* from Elem join tbParent on Elem.[KEY]=tbParent.PARENT_KEY
( b @9 }: m1 o. i6 F: {# E)
* c' r& ^$ {- {$ B SELECT * FROM tbParent
% J1 q3 ^$ H% c3 K --all "sons + grandsons + etc" @parentID Replaced with the ID you need
& m* _- ^+ o" r- c Mwith tbsons as3 v: ^) H- C2 }5 Y! `- y
(; r$ f8 X$ K. a& Y: l, U
select * from Elem where [KEY]=@parentID
5 {; c$ J; W. L union all
0 E: @) `) T$ G. K2 m select Elem.* from Elem join tbsons on Elem.PARENT_KEY=tbsons.[KEY]1 ~* X# d7 g. i( L" P
)$ L# G$ X5 S$ S
SELECT * FROM tbsons+ E) s5 u. K3 K+ p U
PS。我的英语不好。 |
|
|
|
|
|