您可以尝试构建递归 CTE(公用表表达式),如 SQLAuthority 上的这篇文章中所述:
http://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/
作者 Pinal Dave 讨论了在员工表上使用递归 CTE,该表具有 ManagerID 的自引用外键,以返回员工列表,其中包含员工之间的层级数和员工所在的层次结构的顶部没有经理(ManagerID = NULL)。这并不完全是您想要的,但它可能会让您入门。
我做了一些实验,最终得到了与 Mahmoud Gamal 的解决方案非常相似的东西,但略有不同,不仅包括父母、祖父母、曾祖父母等数量,还包括孩子数量。
这是我使用的测试表:
CREATE TABLE Items(ID int IDENTITY
CONSTRAINT PK_Items PRIMARY KEY,
Quantity int NOT NULL,
ParentID int NULL
CONSTRAINT FK_Item_Parents REFERENCES Items(ID));
和数据:
ID 数量 ParentID
-------------------------------------------------- ----------
1 10 {NULL}
2 10 1
3 10 2
4 10 3
5 10 2
这是我的递归查询:
WITH cteRecursiveItems
AS (SELECT Id,
quantity,
0
AS Level
FROM Items
WHERE ParentID IS NULL
UNION ALL
SELECT i.id,
i.quantity,
cri.level + 1
FROM
cteRecursiveItems cri
INNER JOIN items i ON i.ParentID = cri.id)
SELECT ID,
Quantity + (
SELECT MAX(Quantity)
FROM cteRecursiveItems cri3
WHERE cri3.level = cri1.level) + (
SELECT SUM(cri2.Quantity)
FROM cteRecursiveItems cri2
WHERE cri1.level - cri2.level = 1) as Total
FROM cteRecursiveItems cri1
ORDER BY ID;
这是我对测试表运行它得到的结果:
身份证总数
--------------------------------------
1 {NULL}
2 30
3 30
4 40
5 30
它仍然需要稍微调整,因为第一行和第二行相差 10。第 1 行应该总共有 10,第 2 行应该总共有 20。我正在做笔记,以便在我回家时尝试修复它. 现在不能把我雇主的太多时间花在这上面。:) 其他行具有我期望的值。