回答

收藏

在SQL中这可能吗?

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

假设我有一个名为“ species”的表,该表包含3列:“ Id”,“ ancestorId”和“ name”。“ ancestorId”是祖先物种的“2 g# s6 U: s$ C( r9 L" i, B3 P
Id”,因此,例如,如果高智人的祖先是南方古猿,而南方古猿的“ Id”是5,那么高智人的“祖先Id”是5。有一个名为“第一类”的物种,其“$ Q7 e; A% z1 M' b! M7 A/ x- f
Id”为0或为null。所以我想要的是从一个特定物种(例如,智人)到“第一物种”中选择一个祖先列表,无论途中有多少个节点。SQL可能吗?9 W# _( q/ x) C$ m5 ?5 [
                ! p4 }$ Q1 ~& m0 Y* r$ T
解决方案:4 {" O8 G: l( M+ R8 l+ E( `  |
               
6 R: d8 ?+ z6 w: n3 p9 H! ?1 H0 T, n* A9 D; i2 `
0 H5 |/ L; p, q- e: K" B
                ANSI方法是使用递归WITH子句:
9 C# V) f% ^6 p* cWITH hierarchy AS () a6 Q! E( N; N; Y* V
  SELECT t.id,
0 L: m1 P; c+ l3 n: I4 ^         t.name,
3 D: r- U% l' Y* L2 _5 e         t.ancestor
+ K7 m. J* k2 c* |, F! S9 y    FROM TABLE t" P2 j1 n0 w6 d; @7 L
   WHERE t.ancestor IS NULL
( D  V, ?4 c, U  UNION
( h: J" [' J( c0 g  Q, j# O3 w/ y  SELECT t.id,
( e: o1 R0 ^* A. f/ j4 f6 o         t.name,
1 l: m, f+ Z9 y+ ?' F         t.ancestor0 A; O( w3 r) U' v/ S" z& [1 _( D
    FROM TABLE t
) h0 R' j, S& d" E: n    JOIN hierarchy h ON h.ancestorid = t.id). l0 w, N" |( P: x! x
SELECT *
+ ]% G: t5 J  K  P8 _) l) [  FROM hierarchy
/ ]9 M0 F2 b- f: _# u. N支持:
; D2 O! P* z/ F3 rSQL Server 2005以上版本
, b0 Z3 Z7 O6 o9 pOracle 11gR2' t8 {3 Z+ e4 s4 E
PostgreSQL 8.4+
( l4 m  t" X5 N, V; v; n- e

  ]' u) d, |' v0 C从v2开始,Oracle使用CONNECT BY语法提供了分层查询支持。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则