首页 > 解决方案 > 在父级别的 SQL 递归查询中查找 MIN 值?

问题描述

我有一个标准的递归查找脚本,它使用 CTE、“联合所有”、父子关系。我要解决的问题是我想从最低级别的子记录中捕获两个属性并将其放在最高级别的父记录中。

属性是:

  1. 父级子级的最大深度。在我的数据中,并非所有父母在孩子记录中的深度都相同。有些只跨越父级以下 1 级,有些跨越 10 级以下。在查询的输出中,我希望看到父记录包含其子项中的最大深度级别数。

  2. 我的数据中的所有记录都包含一个字段值,但该值仅在层次结构的最低级别上很重要。我希望查询输出父记录上最低级别子项的值。

桌子:

childid, name, keyfield, parentid, level
11, Sally, xyz123, null, 1
1, Alex, xyz456, 11, 2
7, John, abc123, null, 1
3, Erin, abc456, 7, 2
4, Jen, abc789, 3, 3

期望的输出:

childid, name, keyfield_max, keyfield_min
11, Sally, xyz123, xyz456
7, John, abc123, abc789

标签: sqlrecursion

解决方案


SQL 服务器版本:

DECLARE @data TABLE(childid int, [name] nvarchar(128), keyfield varchar(30), parentid int, [level] int);
INSERT @data VALUES(11, 'Sally', 'xyz123', null, 1), (1, 'Alex', 'xyz456', 11, 2), (7, 'John', 'abc123', null, 1), (3, 'Erin', 'abc456', 7, 2), (4, 'Jen', 'abc789', 3, 3);

WITH cte AS (
    SELECT d.*, d.childid AS topid FROM @data d WHERE d.parentid IS NULL
        UNION ALL
    SELECT d.*, cte.topid FROM cte INNER JOIN @data d ON cte.childid = d.parentid
)

SELECT
    d.childid, d.[name], t.keyfield_max, t.keyfield_min
FROM @data d
    OUTER APPLY (SELECT MAX(cte.keyfield) AS keyfield_max, MIN(cte.keyfield) AS keyfield_min FROM cte WHERE cte.topid = d.childid) t
WHERE d.parentid IS NULL

推荐阅读