簡體   English   中英

父/子數據庫如何“匯總”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM