更新が必要です。そして、私は本当に立ち往生しました。 これは古典的な階層的な従業員テーブルの質問ですが、ひねられています。 ユーザーのこの木を見てください: (私の問題とは全く関係のない、私はGoogleの画像で見つかっただけで何か)employees階層従業員テーブルの特別なIDを更新する
は以下同上のを想定します:
RM1: EmpId 1, ParentId null
AM1: EmpId 2, ParentId 1
MGR1: EmpId 3, ParentId 2
MGR2: EmpId 4, ParentId 2
EMP1: EmpId 5, ParentId 3
EMP2: EmpId 6, ParentId 3
EMP3: EmpId 7, ParentId 4
EMP4: EmpId 8, ParentId 4
私がする必要があります別の列を追加し、parentSpecialIdと呼ぶことができます。 このIDは、ルート(AM1とAM2)以下のユーザーのIDです。 AM1およびAM2以下のすべてのユーザーは、rootSpecialIdをroot以下のユーザーに設定する必要があります。私たちを与える
:
RM1: EmpId 1, ParentId null parentSpecialId null
AM1: EmpId 2, ParentId 1 parentSpecialId null
MGR1: EmpId 3, ParentId 2 parentSpecialId 2
MGR2: EmpId 4, ParentId 2 parentSpecialId 2
EMP1: EmpId 5, ParentId 3 parentSpecialId 2
EMP2: EmpId 6, ParentId 3 parentSpecialId 2
EMP3: EmpId 7, ParentId 4 parentSpecialId 2
EMP4: EmpId 8, ParentId 4 parentSpecialId 2
私が持っているすべては私にAM1とAM2との結果セットを与えるこのCTEです。 だから私はEMPXまでずっと行き、 AM1の場合はId 2で、AM2の場合はすべてのユーザーが同じようにparentSpecialIdを更新する必要があります。もちろん、それは動的で、実生活では、私はこれらのユーザーのうち12人がルート以下にいる必要があります。
意味がありますか?
WITH EmpsCTE AS
(
SELECT id, parent, name, 0 AS EmployeeLevel
FROM Employee
WHERE parent = 0
UNION ALL
SELECT e.id, e.parent, e.name, EmployeeLevel + 1
FROM EmpsCTE AS p
JOIN Employee AS e ON e.parent = p.id
)
SELECT id, parent, name, EmployeeLevel
From EmpsCTE where EmployeeLevel = 1
ああ、私は、SQL Serverの2008 R2
Lord High Executioner(RM1)からPeasant(EMP *)への完全な経路をどのように生成するかを実証する、もっと奇妙な例については、[this](http://stackoverflow.com/questions/)をご覧ください。 8912992/how-to-a-well-first-tree-in-a-depth-first-search)記事のポストを参照してください。 – HABO