回答

收藏

Oracle中的分层查询

技术问答 技术问答 334 人阅读 | 0 人回复 | 2023-09-13

我在Oracle11g中有一个具有(id,parent_id)结构的表。( G3 v  n; d3 d$ O( p6 |; N
id    parent_id
; M7 e1 n" W5 C---------------
  G8 ~8 M! i6 R8 B2 `1     (null)
9 b) t5 `0 l2 e* {2     (null); G. m$ K* h, _: d- x: }
3     1
' V" \5 d5 @  K1 f4     32 s: R5 ]$ T7 K( a8 x" |; @
5     3
! r* C% a; m8 j+ L6     2
2 v* I7 c& ~  p5 j; [) m6 a8 v8 @7     28 x* o. U! E' p: \+ U
我想对其进行查询,以获取与这些ID各自分层链接的所有行,因此结果应为:5 q* v7 T. ^0 u/ ^& q; W
root_id  id    parent_id
: \- s( _9 k5 {3 T8 n------------------------1 h! @1 X2 I* c' C! T
1        3     1& b; p$ X  B/ ?1 K3 O. @
1        4     31 n4 J5 A1 S" K* q2 T# [0 Y
1        5     3& w' L1 a  h( i" D1 N" w
2        6     2
4 F+ b) p" r9 c$ W0 l! E1 W5 n2 f2        7     25 U& x7 I% m' g9 k
3        4     3
9 q* N3 F3 C: J( x7 F0 Y3        5     3- }7 N" v1 x$ V! ]0 F( b' J5 W
我一直在connect by和上苦苦挣扎,start with现在,我所能得到的只是查询所需结果的一小部分:7 D. X" G- u* n$ ~2 E9 f
select connect_by_root(id) root_id, id, parent_id from my-table
4 {( z: \! ~8 B+ hstart with id=1& I' J+ M: j: [, F* h9 E
connect by prior id = parent_id: r5 d7 }& O5 w) d- X6 t6 x9 G
我不想使用任何for循环来获取完整的结果。
, H2 G. _6 o6 Y8 Y6 t任何的想法 ?
6 H8 s$ s" ^& U+ @最好的问候,J茅r么我Lefr猫re7 I  G/ e9 P0 }, Q. _( l
PS:在第一个答案之后编辑,注意到我忘记了一些我想要的结果…
1 d+ Y4 ^* `6 A$ l6 z               
3 s9 V7 u) W# E9 \. W- K+ m" ?解决方案:8 M- u8 T/ j5 ^9 v
               
* d, v3 ?3 n& O2 B$ }( U* o3 h! p, ^/ v( h, J
; r# `! M0 i5 C- d
                您发布的查询缺少该from子句,并在下划线下划线connect_by_root,但我认为这些实际上并不是问题的根源。3 q5 E5 P# T/ W# N  b. T
以下查询为您提供所需的结果:% o; m+ ~3 o* r) Y$ }& e- }/ h, i3 x
select * from (5 Q3 T: v9 \' c5 N/ t6 E( Z' h
   select connect_by_root(id) root_id, id, parent_id
/ r9 n' T/ u5 L2 E   from test14 ~( N7 s& v  u/ u/ b6 n  @
   start with parent_id is null
5 q% l6 k/ j) I7 |4 o   connect by prior id = parent_id)  _0 Z' b. s+ u3 v' M% k
where root_id  id% x* ?9 b2 L% y2 B+ g2 u6 `2 Z( s
中心问题是您要指定一个特定的值开始,而不是指定一种方法来标识根行。更改id = 1为parent_id is null可以返回表的全部内容。
* I1 C9 z- p& @( E$ J  v$ R我还添加了外部查询,以从结果集中过滤出根行,这在您的问题中没有提到,但已显示在您想要的结果中。0 v* W9 y  e: F9 r; {+ P: u
SQL小提琴示例
' k1 P' y( y! V( Z$ o0 ~
  t& b( a+ a  Q* ]) R- t& @% S* ?, e评论回应:! U$ @3 H  ]$ `* ?3 e
在提供的版本中,您确实可以获取的后代id = 3,但不能以其3为根。这是因为我们从绝对根开始。解决这个问题很容易,只需省略以下start
- O5 ?( M: N1 A( G+ I2 Cwith子句:. s) f( M* U1 x# ^1 r
SELECT *
. h* S& m( y6 q: _2 wFROM- }, d% }7 F* u- I/ Y' C! `+ `
  (SELECT connect_by_root(id) root_id,
* @0 Q- i6 e! r          id,
% [7 ]2 m; Z, i6 G          parent_id6 l1 z# x/ d, o* g% a4 {( M
   FROM test1+ X, b$ ]  }8 P7 g" R
CONNECT BY
, u2 q' Q: e) V   PRIOR id = parent_id)
' s& A* y6 l3 w3 k. O/ ]WHERE root_id  id
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则