[英]How to do a parent/child database 'roll-up'?
您如何正确地汇总并选择每个母公司的所有用户,直到没有更多母公司?
我正在使用SQL Server 2008 R2,我需要检查是否有@ParentID,然后选择该公司的所有用户,如果该公司上有@ParentID,则做同样的事情,广告无穷大?
谢谢。 我对汇总完全陌生,但只是尝试使用以下类似方法来开始基本的查询思路。
USE [DB]
DECLARE @UserName VARCHAR(250) = 'crusher@abc.com'
DECLARE @ParentID INT = -1
WHILE (@ParentID <> 0)
BEGIN
SELECT @ParentID = CASE
WHEN ParentCompanyID IS NULL
THEN 0
ELSE ParentCompanyID
END
FROM User2Company a
LEFT JOIN dbo.CompanyInfo b ON a.CompanyID = b.CompanyID
LEFT JOIN dbo.widgets ON a.companyid = widgets.companyid
WHERE a.UserName = @UserName
PRINT @ParentID
END
--SELECT * FROM CompanyInfo
--WHERE CompanyID = 100274
--SELECT *
--FROM CompanyInfo
--WHERE CompanyID = 100273
注释的代码只是一个假设示例,该示例在原始查询中找到父公司ID为100274 ...然后该公司找到父公司ID为100273 ...直到最终公司ID 100273在其列中的父公司ID为0。
通常如何完成?
第一个查询的期望输出可能如下所示:
100274
100273
0
此时,我将从这些公司ID中获取所有用户。
通常通过递归CTE完成:
;WITH
tmp AS
(
SELECT CompanyID,
ParentCompanyID
FROM CompanyInfo
WHERE CompanyID = 100274
UNION ALL
SELECT com.CompanyID,
com.ParentCompanyID
FROM CompanyInfo com
INNER JOIN tmp tmp ON com.CompanyID = tmp.ParentCompanyID -- This is the recursive part
)
SELECT * FROM tmp
正如其他人所说,请避免在SQL Server中使用循环。 如果必须使用循环,则有99%的时间没有正确使用SQL Server。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.