每行的SQL都做了一些事情

时间:2018-01-09 12:42:13

标签: sql sql-server

我有一个SQL查询,可以找到指定人员可以访问的“部门”。

有些部门是其他部门的子部门,所以当这个部门进入部门时,他也可以访问他所有的部门。

这是有效的,因为在departments表中,每个部门都有一个名称和ID以及一个“fatherID”,它指定哪个部门是他父亲的部门。

但也有可能这种情况甚至更进一步,我发现没有办法显示一级子部门以下所有部门的名称。

SELECT B.DepartmentDesc FROM  CompanyDepartmentPermission A 
INNER JOIN CompanyDepartment] B 
ON A.DepartmentID=B.DepartmentID 
OR A.DepartmentID=B.FatherDepartmentID 
WHERE A.PEmplID = 68

这是可能的。我从部门及其所有子部门获得所有名称:

enter image description here

但在这种情况下,我得到了每个子部门,除了嵌套级别更低。

enter image description here

我的目标是能够递归地显示所有嵌套的子部门。 我只需要在1个查询中执行此操作。由于我非常缺乏经验,并且对嵌套查询的了解不多,我还没有找到解决这个问题的方法。我希望有人可以给我一个正确的方向。

PS:我在C#程序中制作的图片,我工作的地方,这只是为了澄清它的外观。我希望我能解释我想要的东西。否则请告诉我,我会尝试改写这个:)

修改 这是两个表的结构。谢谢Akaino指出

enter image description here

SOLUTION: 可悲的是,这里没有任何一个帮助我,而是在这里有一个类似的问题。 WITH UNION语句对我帮助很大。这是我的问题的工作查询。

WITH DepartmentHirarchy AS
(
SELECT B.DepartmentID,DepartmentDesc,FatherDepartmentID, DepartmentResponsiblePEmplID
FROM CompanyDepartment AS B
INNER JOIN CompanyDepartmentPermission AS A ON A.DepartmentID=B.DepartmentID
WHERE A.PEmplID= 34 OR DepartmentResponsiblePEmplID = 34
UNION ALL
SELECT  nextLevel.DepartmentID,nextLevel.DepartmentDesc,nextLevel.FatherDepartmentID, nextLevel.DepartmentResponsiblePEmplID
FROM DepartmentHirarchy AS recCall
INNER JOIN CompanyDepartment AS nextLevel ON nextLevel.FatherDepartmentID=recCall.DepartmentID
)
SELECT * FROM DepartmentHirarchy
ORDER BY FatherDepartmentID,DepartmentID
GO

2 个答案:

答案 0 :(得分:2)

对于父/子树层次结构,请尝试以下SQL代码。

我假设,你的表名是Departments。您可以在以下SQL中更改表名。

我使用SQL Server。

WITH RELATION (DepartmentID, FatherDepartmentID, DepartmentDesc, [Level], [Order])
AS
(
    SELECT DepartmentID, FatherDepartmentID, DepartmentDesc, 0, CAST(DepartmentID AS VARCHAR(200))
    FROM Departments
    WHERE FatherDepartmentID IS NULL
    UNION ALL
    SELECT P.DepartmentID, P.FatherDepartmentID, P.DepartmentDesc, R.[Level]+1, CAST(R.[Order] + '_' + CAST(p.DepartmentID AS VARCHAR(200)) AS VARCHAR(200))  
    FROM Departments P
    JOIN RELATION R ON P.FatherDepartmentID = R.DepartmentID
)
SELECT RIGHT('----------', ([Level]*3)) + DepartmentDesc  
FROM RELATION R
JOIN CompanyDepartment D ON D.DepartmentID = R.DepartmentID 
WHERE PEmplID= 68
ORDER BY R.[ORDER]

答案 1 :(得分:-1)

您似乎想要进行层次结构搜索。 如果您的服务器支持使用层次结构数据类型(如果不支持,如果您计划使用大量的层次结构搜索,则可能需要考虑它),您可以尝试使用isDescendantOf方法。

实施例

DECLARE @parent hierarchyid
SELECT @parent = B.DepartmentDesc
FROM CompanyDepartment B 
Where B.DepartmentDesc = 'Name your deparment'

SELECT *  
FROM CompanyDepartment 
WHERE DepartmentDesc.IsDescendantOf(@parent) = 1 ;