回答

收藏

选择同一表关系中的所有父级或子级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。我的英语不好。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则