【发布时间】:2018-06-18 12:06:45
【问题描述】:
我有一个 SQL 查询,用于查找指定人员有权访问的“部门”。
有些部门是其他部门的子部门,因此当此人有权访问某个部门时,他也可以访问他的所有子部门。
之所以可行,是因为在部门表中,每个部门都有一个名称和 ID 以及一个“fatherID”,它指定哪个部门是他的父部门。
但这也有可能嵌套得更深,我发现无法显示低于 1 级子部门的所有部门的名称。
SELECT B.DepartmentDesc FROM CompanyDepartmentPermission A
INNER JOIN CompanyDepartment] B
ON A.DepartmentID=B.DepartmentID
OR A.DepartmentID=B.FatherDepartmentID
WHERE A.PEmplID = 68
这是可能的。我得到了部门和他所有子部门的所有名字:
但在这种情况下,我得到了每个子部门,除了嵌套级别更低。
我的目标是能够递归地显示所有嵌套的子部门。 我只需要在 1 个查询中执行此操作。由于我非常缺乏经验并且对嵌套查询没有太多洞察力,我还没有找到解决这个问题的方法。我希望有人能给我一个正确的方向。
PS:图片来自我制作的 C# 程序,我让它工作的地方,这只是为了澄清它的外观。我希望我能解释我想要什么。否则请告诉我,我会尝试改写这个:)
编辑: 这是两个表的结构。感谢赤野指出
解决方案: 可悲的是,这里没有一个回答对我有帮助,而是在 SO 上有一个类似的问题。 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
【问题讨论】:
-
从数据库中选择所有部门并用C#组织它们
-
@selami 我很遗憾不能使用 c#,我必须使用 1 个查询。这是我的老板给我的一个特定用途的任务
-
那是糟糕的设计。在不知道嵌套查询需要多“深”的情况下,使用纯 sql 完成此操作的机会很小。你有数据库模式吗?可能还有另一种更方便的方法。
-
@akaino 我会更新问题
-
@akaino 据我所知,我的老板希望这个单一的查询能够复制粘贴以供某些用途。他做了几年的程序员,所以我想当他要求时可以这样做:)
标签: sql sql-server