如何进行父/子数据库的“汇总”?

时间:2014-09-16 17:19:06

标签: sql sql-server database

在没有更多母公司之前,您如何正确地为每家母公司选择所有用户?

我正在使用SQL Server 2008 R2,我需要检查是否有@ParentID然后选择该公司的所有用户,如果该公司的@ParentID做同样的事情,广告无限?

感谢。我对Rollups完全不熟悉,但我只是尝试类似下面的内容来启动基本的查询想法。

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 ......直到最终CompanyID 100273的列中的ParentCompanyID为0。

这是典型的吗?

第一个查询的DESIRED输出可能如下所示:

100274
100273
0

此时我会从那些公司ID中获取所有用户。

1 个答案:

答案 0 :(得分:2)

通常使用递归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。