会社の従業員のリストとその所属するチームを追加の列とともに出力するSQLServer2008クエリを作成しています。
組織ツリーの例:
Level 0: CEO
Level 1: A, B, and C
Level 2:
For A:1,2,3
For B:4,5,6
For C:7,8,9
結果のセットには、名前、(ツリーの)レベル、およびチームの3つの列が表示されます。1、2、および3の場合、「A」をチーム、2をレベルと見なします。4、5、および6の場合、レベルの場合は「B」および2など。
再帰クエリを使用してツリーをナビゲートしていますが(問題はありません)、チーム名をクエリに「伝える」必要があるため(レベル8の場合は、レベル1の人が表示されます)に報告してください)、私はこれをやっています:
(...)
UNION ALL
-- Recursive Member Definition
-- in here level increments one each time, and the team should output the child
-- of the top manager
SELECT A.treenodeid, A.parentnodeid, A.email, LEVEL+1, team =
CASE LEVEL
When 1 then SET @salead = A.Email
Else @salead
END
FROM XX as A
INNER JOIN TeamsTable as B on A.parentnodeid = b.treenodeID
CASEを使用してレベルが1かどうかを確認しようとしているので(チーム名をチームリーダーの電子メール名に更新するため)、SQLは「 SETの近くの構文が正しくない」と言い続けます。
この種の割り当てをCASEで行うことは可能ですか?私は周りを見回しましたが、これが私の再帰的なケースで機能するかどうかはわかりませんでした。
すべてのクエリは次のとおりです(ルートが「JohnSmith」であると想定)。
WITH TeamsTable (treenodeid, parentnodeid, email, Level, team)
AS
(
-- Anchor - Level starts with 0, and the team is empty for the top manager
SELECT treenodeid,parentnodeid,email,0,''
FROM XX WHERE email = 'JohnSmith'
UNION ALL
-- Recursive Member Definition - in here level increments one each time, and the team should output the child of the top manager
SELECT
A.treenodeid, A.parentnodeid, A.email, LEVEL+1, team =
CASE LEVEL
When 1 then SET @salead = A.Email
Else @salead
END
FROM XX as A
INNER JOIN TeamsTable as B on A.parentnodeid = b.treenodeID
)
-- Statement that executes the CTE
SELECT *
FROM TeamsTable
どうもありがとう、みんな!