2012-06-22 198 views
1

我正在使用SQL Server 2005,并且熟悉基础知识,但是有一个问题比我的脑袋稍微高一点,我将不胜感激任何帮助。递归SQL查询

我有两个表,我正在尝试使用。一个是员工数据库表,另一个是组织表。在员工表中,每个员工都有一个与他们相关的部门ID和当前的雇佣状态。在组织表中,有一个部门ID列表,该部门汇总的部门以及当前的活动状态。我需要创建一个查询,我可以给出一个部门ID,以便将该部门中活动的(A值)员工和下面的所有活动(A值)部门的总数返回到底部。

相关表和列:
EE_Persons_today
DEPTID
EMPL_STATUS

DEPARTMENT_DATA
DEPTID
REPORTS_TO_DEPT
EFF_STATUS

示例:
IT部门有300人直接分配给它,但也有2个子组,软件和硬件。硬件有100人直接分配给它,并没有子组。软件有100个人直接分配给它,1个子组称为Enterprise,有50个人直接分配给它。如果我问IT中有多少人,那么它会是300 + 100 + 100 + 50 = 550.如果我问软件中有多少人,那么它会是100 + 50 = 150。

回答

0

检查CTE(公用表表达式)以进行递归SQL查询。我在下面包含了一个示例。请让我知道它是否适用于您的设置。

将@INPUT的值更改为您请求的人数的部门(其中EMPL_STATUS ='A')。

DECLARE @INPUT INT 
SET @INPUT = 1 


DECLARE @DEPARTMENT_DATA TABLE 
(
    DEPTID INT, 
    REPORTS_TO_DEPT INT, 
    EFF_STATUS INT 
) 


INSERT INTO @DEPARTMENT_DATA 
SELECT 1, NULL, 1 
UNION SELECT 2, 1, 1 
UNION SELECT 3, 2, 1 
UNION SELECT 4, 1, 1 
UNION SELECT 5, 4, 1 


DECLARE @EE_Persons_today TABLE 
(
    ID INT IDENTITY(1,1), 
    DEPTID INT, 
    EMPL_STATUS VARCHAR(1) 
) 

INSERT INTO @EE_Persons_today 
SELECT 2, 'A' 
UNION ALL SELECT 2, 'A' 
UNION ALL SELECT 2, 'A' 
UNION ALL SELECT 2, 'A' 
UNION ALL SELECT 2, 'B' 
UNION ALL SELECT 3, 'A' 
UNION ALL SELECT 3, 'A' 
UNION ALL SELECT 3, 'B' 
UNION ALL SELECT 3, 'A' 
UNION ALL SELECT 3, 'A' 
UNION ALL SELECT 3, 'A' 
UNION ALL SELECT 3, 'A' 
UNION ALL SELECT 3, 'B' 
UNION ALL SELECT 3, 'A' 
UNION ALL SELECT 3, 'A' 
UNION ALL SELECT 4, 'B' 
UNION ALL SELECT 4, 'A' 
UNION ALL SELECT 5, 'A' 
UNION ALL SELECT 5, 'A' 
UNION ALL SELECT 5, 'B' 
UNION ALL SELECT 5, 'A' 


; WITH CTE AS 
(
    SELECT a.DEPTID 
    FROM @DEPARTMENT_DATA a 
    WHERE a.DEPTID = @INPUT 

     UNION ALL 

    SELECT a.DEPTID 
    FROM @DEPARTMENT_DATA a 
    JOIN CTE c 
     ON a.REPORTS_TO_DEPT = c.DEPTID 
) 
SELECT COUNT(*) 
FROM @EE_Persons_today a 
JOIN CTE c 
    ON a.DEPTID = c.DEPTID 
WHERE a.EMPL_STATUS = 'A' 
+0

这工作得很好!非常感谢您的快速回复。 – Squared

+0

很高兴听到它! –