我创建了一个递归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 |
+------------+----------+------+--------+-------+
在第二个子查询中,我想您要替换:
B.KFID
with:
COALESCE(B.KFID, T.KFID)
这应该带来层次结构中最“最近的” KFID
。