3

再帰クエリに制限を設定したいと思います。しかし、再帰を制限した最後のエントリを失いたくありません。

現在、クエリは次のようになっています。

WITH MyCTE (EmployeeID, FirstName, LastName, ManagerID, level, SPECIAL)
AS ( 
    SELECT a.EmployeeID, a.FirstName, a.LastName, a.ManagerID, 0 as Level
    FROM MyEmployees as a
    WHERE ManagerID IS NULL

    UNION ALL
    SELECT b.EmployeeID, b.FirstName, b.LastName, b.ManagerID, level + 1
    FROM MyEmployees as b
    INNER JOIN MyCTE ON b.ManagerID = MyCTE.EmployeeID
    WHERE b.ManagerID IS NOT NULL and b.LastName != 'Welcker' 
)
SELECT *
FROM MyCTE
OPTION (MAXRECURSION 25) 

そして、それはマネージャーウェルカーによって制限され、結果は次のようになります。

EmployeeID; FirstName; LastName; ManagerID; level
1           Ken        Sánchez   NULL       0

私が欲しいのは、従業員「ウェルカー」を含めることです。問題は、リストに含める必要のある最後の人の名前しか持っていないことです。コマンド構造には以下のエントリがいくつかありますが、私はそれらを知りません。また、それらを見たくありません。

これは、クエリの結果がどのように見えるかを想像する例です。

EmployeeID FirstName LastName ManagerID level
1          Ken       Sánchez  NULL        0
273        Brian     Welcker  1           1

どんな助けでも大歓迎です

4

3 に答える 3

2
WITH MyCTE (EmployeeID, FirstName, LastName, ManagerID, level, NotMatched)
AS ( 
    SELECT a.EmployeeID, a.FirstName, a.LastName, a.ManagerID, 0 as Level, 0 AS NotMatched
    FROM MyEmployees as a
    WHERE ManagerID IS NULL
    UNION ALL
    SELECT b.EmployeeID, b.FirstName, b.LastName, b.ManagerID, level + 1,
           CASE WHEN (MyCTE.LastName = 'Welcker' AND MyCTE.level = 1) THEN 1 ELSE MyCTE.NotMatched END
    FROM MyEmployees as b
    INNER JOIN MyCTE ON b.ManagerID = MyCTE.EmployeeID
)
SELECT *
FROM MyCTE
WHERE NotMatched != 1
于 2012-11-14T19:35:12.587 に答える
0

その1行をに変更できますb.LastName = 'Welcker'か?

于 2012-11-14T17:34:18.553 に答える
0
select distinct
   t.b_eid as empId,
   t.b_name as name, 
   case t.b_mid when 0 then null else t.b_mid end as managerId

   --convert(varchar,t.b_eid) + ', ' + 
   --t.b_name + ', ' + 
   --case t.b_mid when '0' then 'null' else convert(varchar,t.b_mid) end
      --as bvals

from(
   select
      coalesce(a.mid, 0) as a_mid,
      a.eid as a_eid,
      a.name as a_name,
      coalesce(b.mid, 0) as b_mid,
      b.eid as b_eid,
      b.name as b_name
   from 
      (values(null,1,'adam'),(null,2,'barb'),(201,3,'chris')) as a(mid,eid,name) cross join 
      (values(null,1,'adam'),(null,2,'barb'),(201,3,'chris')) as b(mid,eid,name)
) as t
where (t.a_mid = t.b_eid or t.a_mid = 0 or t.b_mid = 0) and t.a_name != 'chris'
于 2012-11-14T21:20:20.417 に答える