我有一个employees表,其中有一个列Employee_ID和SuperiorID。我想要得到某个特定员工的所有上级。如Employee_ID-1000000的上级为1000001、1000002、1000003、1000004和1000005
+--------------------------+
| Employee_ID | SuperiorID |
+--------------------------+
| 1000000 | 1000001 |
| 1000001 | 1000002 |
| 1000002 | 1000003 |
| 1000003 | 1000004 |
| 1000004 | 1000005 |
+--------------------------+Employee_ID - 1000005是该公司的总裁。
我现在有一个问题:
DECLARE @EmployeeNo AS INT = 1000000
SELECT Superior_ID from EmployeeTable WHERE Employee_ID = @EmployeeNo
UNION
SELECT Superior_ID from EmployeeTable WHERE Employee_ID = (select Superior_ID from EmployeeTable WHERE Employee_ID = @EmployeeNo)
UNION
SELECT Superior_ID from EmpoyeeTable WHERE Employee_ID = ( SELECT Superior_ID from EmployeeTable WHERE Employee_ID = (select Superior_ID from EmployeeTable WHERE Employee_ID = @EmployeeNo))有没有更好的方法来解决这个问题?
谢谢你的帮助。
发布于 2021-06-08 11:38:24
是的,您需要recursive cte:
DECLARE @EmployeeNo AS INT = 1000000;
with cte as (
select Employee_ID, SuperiorID
from EmployeeTable where Employee_ID = @EmployeeNo
union all
select e.Employee_ID, e.SuperiorID
from cte join EmployeeTable e on cte.SuperiorID = e.Employee_ID
where e.Employee_ID <> '1000005' --president
)
select * from cte;发布于 2021-06-08 11:39:04
我们可以在这里使用递归分层查询。下面的策略是从employee 1000000开始沿着命令链向上构建完整的层次结构。递归止于employee 1000004,其上级没有进一步的记录。在下面的递归CTE中,我跟踪了一个计数器,它随着每一步的递增而递增。然后,我们使用TOP技巧只选择排名最高的记录。
WITH cte (EmployeeID, SuperiorID, n) AS (
SELECT Employee_ID, SuperiorID, 1
FROM EmployeeTable
WHERE Employee_ID = 1000000
UNION ALL
SELECT e.Employee_ID, e.SuperiorID, n+1
FROM cte t
INNER JOIN EmployeeTable e
ON t.SuperiorID = e.Employee_ID
)
SELECT TOP 1 *
FROM cte
ORDER BY n DESC;
发布于 2021-06-09 02:41:12
试试这个:
DECLARE @EmployeeTable TABLE (EmployeeID int, SuperiorID int);
INSERT INTO @EmployeeTable
VALUES
(1000000, 1000001)
, (1000001, 1000002)
, (1000002, 1000003)
, (1000003, 1000004)
, (1000004, 1000005)
;
DECLARE @EmployeeNo int = 1000004
, @President int = 1000005
;
WITH Employee AS
(
SELECT
EmployeeID = @EmployeeNo
UNION ALL
SELECT EmployeeID = S.SuperiorID
FROM Employee E
JOIN @EmployeeTable S ON S.EmployeeID = E.EmployeeID
)
SELECT * FROM Employeehttps://stackoverflow.com/questions/67881046
复制相似问题