これは難しい問題ですが、解決可能です。まず、ORDER BY のない SQL クエリは順序付けを保証しないことを覚えておく必要があります。したがって、たまたま正しい結果が生成されたからといって、そのクエリが目的に対して正しいとは限りません。
課題は、レコードにソートキーを追加して、物事を正しい順序に並べることです。これは、レコードの深さ優先の順序付けです。課題の 1 つは、同じマネージャーを持つ 3 人の従業員が異なるキーを必要とすることです。これは、従業員の間に別のレコードが表示される可能性があるためです。
したがって、機能するソートキーは、従業員 ID を含むトップへのパスを生成することによって構築されます。データの場合、キーは次のようになります。
- 「7839」
- '7839<--7698'
- '7839<--7782'
- '7839<--7566'
- '7839<--7698<--7654'
これらは適切な順序でソートされます。キーの作成は困難であり、再帰的な CTE が必要です。(阿部さん、提供ありがとうございます。)
WITH MyCTE AS
(
SELECT EMPNO, EName, Null as ManagerId, NULL as ManagerName,
cast(EMPNO as varchar(8000)) as sortkey
FROM Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT EMPNO, EName, ManagerId, MyCTE.EName,
mycte.sortkey+'<--'+cast(Employee.empno as varchar(8000))
FROM Employee
INNER JOIN MyCTE ON Employee.ManagerID = MyCTE.EmpID
WHERE Employee.ManagerID IS NOT NULL
)
SELECT EMPNO, EName, ManagerId, MyCTE.EName
FROM MyCTE
order by sortkey
実際のソートキーは上記のものと似ていますが、'<--' が追加されています。1 つの注意点として、これはソート キーが正確に 4 桁の場合にのみ機能します。さまざまな長さがある場合は、左にゼロを埋め込む必要があります。