递归SQL查询

时间:2012-06-22 17:04:25

标签: sql-server-2005 recursive-query

我正在使用SQL Server 2005,并熟悉基础知识,但有一个问题有点让我头疼,我将不胜感激。

我正在尝试使用两个表。一个是员工数据库表,一个是组织表。在员工表中,每个员工都有一个与他们相关的部门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个子组称为企业,有50人直接分配给它。如果我问IT中有多少是300 + 100 + 100 + 50 = 550.如果我要求软件中有多少是100 + 50 = 150。

1 个答案:

答案 0 :(得分: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'