このサイトですでに多くの再帰的 CTE の例を見てきましたが、これを自分のデータに適用しようとしました。ほとんどの例よりも結合がいくつかあるようですが、そこに到達していると思います。私が助けてほしい問題は、次のようなエラーが表示されることです。
声明は終了しました。ステートメントが完了する前に、最大再帰回数 100 を使い果たしました。
CTE の最初の select ステートメントを実行し、2 番目の select ステートメントを (実際の位置コードが異なる) 繰り返し実行しました。この従業員には 6 つのレベルがあるため、エラーが発生する理由がわかりません。
私の疑いの領域の 1 つは、これは「Reports To」関係タイプであるため、基準「relationship_type_id = 0」を適用する必要があるということです。これを左外部結合にしようとしましたが、許可されていません。これは、このクエリを使用してトップ レベルの管理者 (つまり、管理者を持たない人) を取得できないことを意味します。
以下のコードを投稿しました。どんな助けでも大歓迎です。
WITH EmployeeHierarchy (EmployeeID, LastName, FirstName, PositionCode, ReportsTo, HierarchyLevel) AS
(
SELECT
p.employee_id as EmployeeID,
p.last_name as LastName,
p.first_name as FirstName,
pos.position_code as PositionCode,
r.to_position_code as ReportsTo,
1 as HierarchyLevel
FROM
--JOIN: Personal details
dbo.person p
--JOIN: Employment links a person to a post (could have more than one)
INNER JOIN
dbo.employment e ON e.employee_id = p.employee_id
--JOIN: details of the position held
INNER JOIN
dbo.position pos ON pos.position_code = e.position_code
--JOIN: Relationships between the positions, one position reports to another position etc.
-- There are several 'relationship types', we are only interested in relationship_type_id = 0
-- as this is the 'Reports to' relationship code. Others types include 'Managed by' etc.
INNER JOIN
dbo.relationship r ON r.from_position_code = pos.position_code AND r.relationship_type_id = 0
WHERE
--CRITERIA: Use my employee Id as a starting point for testing
p.employee_id = '10076395'
UNION ALL
-- Recursive step
SELECT
p2.employee_id as EmployeeID,
p2.last_name as LastName,
p2.first_name as FirstName,
pos2.position_code as PositionCode,
r2.to_position_code as ReportsTo,
eh.HierarchyLevel + 1 AS HierarchyLevel
FROM
dbo.person p2
INNER JOIN
dbo.employment e2 ON e2.employee_id = p2.employee_id
INNER JOIN
dbo.position pos2 ON pos2.position_code = e2.position_code
INNER JOIN
dbo.relationship r2 ON r2.from_position_code = pos2.position_code AND r2.relationship_type_id = 0
--JOIN: Link this query back to the base query
INNER JOIN
EmployeeHierarchy eh ON r2.from_position_code = eh.PositionCode
)
SELECT *
FROM EmployeeHierarchy
ORDER BY HierarchyLevel, LastName, FirstName