0

次の表があります。

ID      Emp_Name     Manager_ID
101     Ken          NULL
102     Terri        101
103     Roberto      101
104     Rob          102
105     Gail         102
106     Jossef       103
107     Dylan        103
108     Diane        105
109     Gigi         105
110     Michael      106

たとえば、「106 Josef」のすべてのマネージャーを取得する必要があり、結果は次のようになります。

106     Josef        103
103     Roberto      101
101     Ken          NULL

それを行うのに最適なSQLサーバークエリは何ですか

4

2 に答える 2

1

while ループを実行して、プリンシパル ノードを取得できるまで 3 つのマネージャーを調べることができます。各反復で、コードはテンポラル テーブルに行を挿入します。ここに例があります。

DECLARE @employeeId  int
DECLARE @managerId int

SET @employeeId=106
SET @managerId=(SELECT Manager_ID FROM Employees WHERE ID=@employeeId)

DECLARE @tableEmployee as TABLE 
(
ID int,
NAME varchar(100),
MANID INT
)
INSERT INTO @tableEmployee SELECT * FROM Employees WHERE ID=@employeeId

WHILE @managerId is not null
BEGIN
INSERT INTO @tableEmployee SELECT * FROM Employees WHERE ID=@managerId
SET @managerId=(SELECT Manager_ID FROM Employees WHERE ID=@managerId)
END
SELECT * FROM @tableEmployee
GO

私は最高ではないと思いますが、うまくいきます。これが役立つことを願っています:)。

于 2013-10-05T05:23:00.620 に答える
1

私の再帰的CTEは非常にさびており、テストに便利なデータベースがありません。これは別の方向(マネージャーから報告先)に行く方が簡単ですが、これでうまくいくか、少なくとも近づくと思います:

declare @EmpID int;
set @EmpId = 106;

with IDs (ID, Manager_ID) As (
     select ID, Manager_ID FROM Employees WHERE ID = @EmpID
     UNION ALL
     SELECT ID, Manager_ID 
     FROM Employees e
     LEFT JOIN ManagerIDs m on e.ID = m.Manager_ID
     WHERE e.ID IS NOT NULL
)
SELECT e.*
FROM IDs i
INNER JOIN Employees e on e.ID = i.ID;
于 2013-10-04T23:24:04.363 に答える