sql - SQL Recursive:获取孩子的父值
问题描述
我创建了一个返回所有父母和所有孩子的递归 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
和:
COALESCE(B.KFID, T.KFID)
这应该在层次结构中引入最新的“最新” KFID
。
推荐阅读
- html - Boostrap 4中的提交按钮和输入具有不同的宽度
- javascript - React Storybook with Webpack Error - Module build failed: TypeError: Cannot read property 'thisCompilation' of undefined
- java - 爪哇。服务器不发送正确的 HTML
- newline - 文件中的换行符和回车符无法在 Polybase 中解析
- spring - 如何从 SessionRegistry 获取用户名,它总是返回 ADMIN 用户
- node.js - 使用 node.js 应用程序配置 nginx 的问题
- algorithm - 有一个复杂到复杂的 2D FFT,如何进行 3D FFT?
- python - 已抓取 0 页 已抓取 0 项
- reactjs - 如何将自定义注册字段添加到 react-firebase
- html - Div bootstrap 背景位置