0

私は以下のようなテーブルを持っています

Emp_id、Emp_user_id、Emp_Name、Emp_mgr_id

Emp_mgr_id は Manager の emp_id になります。

たとえば、以下のようなデータがあります

Emp_id Emp_user_id Emp_Name Emp_mgr_id
1      D021         Joe      6
2      D024         Kathy    6
3      D054         Shaun    1
4      D058         Tippu    2
5      D059         Paul     4
6      D070         David    9
7      D075         Jack     9

ここで、フォームを作成する必要があります。David が ID D070 でログインしたときに、すべての従業員レポートを David にプルする必要があります。

D021 Joe
 -->D054 Shaun
D024  Kathy
  -->D058   Tippu
  -->D059   Paul

行を直属の部下ごとにグループ化したかったのです。

このようなデータを取得するためのクエリを作成する方法を知っている人はいますか? 入力は Emp_User_id で、出力は直属の部下ごとにグループ化されたすべての部下が必要です。

ありがとう

4

3 に答える 3

2

これには、再帰共通テーブル式を使用できます。実際、これはそれらの最も一般的な使用法の1つです(マネージャー->従業員タイプの階層)

WITH Emp_CTE AS (
SELECT Emp_ID, Emp_User_ID, Emp_Name, Emp_Mgr_ID
FROM EmpTable
WHERE Emp_Mgr_ID IS NULL -- This assumes the top-level managers have no manager.
UNION ALL
SELECT Emp_ID, Emp_User_ID, Emp_Name, Emp_Mgr_ID
FROM EmpTable AS e
    INNER JOIN Emp_CTE AS cte ON cte.Emp_ID = e.Emp_Mgr_ID
)
SELECT *
FROM Emp_CTE
于 2012-07-09T21:12:46.633 に答える
1

こんにちは、以下の sproc を見つけて、名前を順番に取得してください。

CREATE TABLE emptbl(Emp_id int, Emp_user_id varchar(10), Emp_Name varchar(100), Emp_mgr_id int)

INSERT INTO emptbl
VALUES(1,'D021','Joe',6),
(2,'D024','Kathy',6),
(3,'D054','Shaun',1),
(4,'D058','Tippu',2),
(5,'D059','Paul',4),
(6,'D070','David',9),
(7,'D075','Jack',9)

SELECT * FROM emptbl



CREATE Proc sp_getRepportees
@emp_id varchar(20)
As
--sp_getRepportees 'D070'
DECLARE @min int=1
DECLARE @max int

DECLARE @empout TABLE(Emp_id int, Emp_user_id varchar(10), Emp_Name varchar(100), Emp_mgr_id int)
;WITH CTEEmp(Emp_id,Emp_user_id,Emp_Name,Emp_mgr_id) As
(
SELECT Emp_id,Emp_user_id,Emp_Name,Emp_mgr_id from emptbl where Emp_user_id=@emp_id
UNION ALL
SELECT et.Emp_id,et.Emp_user_id,et.Emp_Name,et.Emp_mgr_id from emptbl et inner join CTEEmp e on et.Emp_mgr_id = e.emp_id)

,CTE2(rno,Emp_id,Emp_user_id,Emp_Name,Emp_mgr_id) as(
SELECT ROW_NUMBER() over (order by emp_id) as rno,* FROM CTEEmp where Emp_user_id<>@emp_id)

select * into #tempe from CTE2
SELECT @max=COUNT(*) from #tempe

select * from #tempe
While(@min<=@max)
begin

IF EXISTS(select Emp_id,Emp_user_id,Emp_Name,Emp_mgr_id from #tempe where Emp_mgr_id in (select Emp_id from #tempe where rno=@min))
begin
INSERT INTO @empout
select Emp_id,Emp_user_id,Emp_Name,Emp_mgr_id from #tempe where rno=@min
union  
select Emp_id,Emp_user_id,Emp_Name,Emp_mgr_id from #tempe where Emp_mgr_id in (select Emp_id from #tempe where rno=@min)
end

delete from #tempe where rno=@min
SET @min+=1
end

select Emp_user_id,Emp_Name from @empout
于 2012-07-10T09:48:57.350 に答える
1

これが CTE の出力です。ただし、ここでは、結果を目的の形式で表示するために少し変更を加える必要があります。

CREATE TABLE emptbl(Emp_id int, Emp_user_id varchar(10), Emp_Name varchar(100), Emp_mgr_id int)

INSERT INTO emptbl VALUES(1,'D021','Joe',6), (2,'D024','Kathy',6), (3,'D054','Shaun',1), (4,' D058','Tippu',2), (5,'D059','Paul',4), (6,'D070','David',9), (7,'D075','Jack',9 )

SELECT * FROM emptbl

;WITH CTEEmp(Emp_id,Emp_user_id,Emp_Name,Emp_mgr_id) As
(
SELECT Emp_id,Emp_user_id,Emp_Name,Emp_mgr_id from emptbl where Emp_user_id='D070'
UNION ALL
SELECT  et.Emp_id,et.Emp_user_id,et.Emp_Name,et.Emp_mgr_id from emptbl et inner join CTEEmp e on et.Emp_mgr_id = e.emp_id)

,CTEEmp1(Emp_id,Emp_user_id,Emp_Name,Emp_mgr_id)As
(SELECT Emp_id,Emp_user_id,Emp_Name,Emp_mgr_id from CTEEmp where Emp_user_id<>'D070')

SELECT * FROM CTEEmp1 
于 2012-07-10T09:54:16.113 に答える