SQL递归:获取子项的父值

问题描述 投票:0回答:1

我创建了一个递归SQL,该SQL返回所有父母和所有孩子。父母在KFID栏中始终有一个值,而孩子则没有。如何从一位父母为其所有子女选择KFID值?

    SELECT   B.LFDNR
       ,convert(varchar(max), '') /*convert(varchar(max), ROW_NUMBER() OVER(ORDER BY B.POSI))*/ AS Position
       ,0 as FLAG
       ,B.KFID
       ,B.BGRNR
  FROM  MU_Navigator.KONFIG_BASE B -- WITH (NOLOCK)
 WHERE (B.BELID  = @belegLfdnr)
   AND (ISNULL(B.PAREN, '') = '') -- is root / hasnt parent
UNION ALL
SELECT   B.LFDNR
       ,CASE WHEN T.Position = '' THEN '' ELSE T.Position + convert(varchar(max), '.') END + convert(varchar(max), ROW_NUMBER() OVER(ORDER BY B.POSI)) AS Position
       ,0 as  flag
       ,B.KFID
       ,t.BGRNR
  FROM  MU_Navigator.KONFIG_BASE B INNER JOIN
        KBTree T
    ON (B.PAREN = T.LFDNR)      -- on primary key, bijective n:1 relation
 WHERE (B.BELID  = @belegLfdnr) -- redundant, but query plan is much more efficient with that prefilter

当前结果:

+------------+----------+------+--------+-------+
|   LFDNR    | Position | flag |  KFID  | BGRNR |
+------------+----------+------+--------+-------+
| 0260897021 |          |    0 | NULL   | BU    |
| 0260897022 | 1        |    0 | 004530 | BU    |
| 0260897170 | 1.1      |    0 | NULL   | BU    |
| 0260897153 | 1.2      |    0 | NULL   | BU    |
| 0260897023 | 2        |    0 | 002442 | BU    |
| 0260897025 | 2.1      |    0 | NULL   | BU    |
| 0260897024 | 3        |    0 | 002524 | BU    |
| 0260897026 | 3.1      |    0 | NULL   | BU    |
+------------+----------+------+--------+-------+
sql sql-server recursion
1个回答
1
投票

在第二个子查询中,我想您要替换:

B.KFID

with:

COALESCE(B.KFID, T.KFID)

这应该带来层次结构中最“最近的” KFID

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.