Here is a little example:
DECLARE @DIM_AM TABLE([AM_ID] INT, [AMI_ID] int, [Parent_AMI_ID] INT, [AMI_Code] VARCHAR(20))
DECLARE @DIM_AMI TABLE([AMI_ID] INT, [AMI_Name] VARCHAR(20))
INSERT INTO @DIM_AMI VALUES
(1, 'AMI1'),
(2, 'AMI2'),
(3, 'AMI3'),
(4, 'AMI4')
INSERT INTO @DIM_AM VALUES
(1, 1, NULL, 'CODE_AMI1'),
(2, 2, 1, 'CODE_AMI2'),
(3, 3, 1, 'CODE_AMI3'),
(4, 4, 3, 'CODE_AMI4')
;WITH cte AS(SELECT *, 0 AS Level FROM @DIM_AM WHERE Parent_AMI_ID IS NULL
UNION ALL
SELECT d.*, c.Level + 1 FROM cte c
JOIN @DIM_AM d ON c.AMI_ID = d.Parent_AMI_ID)
SELECT c.Level, c.AMI_Code, d.AMI_Name FROM cte c
JOIN @DIM_AMI d ON d.AMI_ID = c.AMI_ID
Output:
Level AMI_Code AMI_Name
0 CODE_AMI1 AMI1
1 CODE_AMI2 AMI2
1 CODE_AMI3 AMI3
2 CODE_AMI4 AMI4
This is recursive common table expression(cte):
;WITH cte AS(SELECT *, 0 AS Level FROM @DIM_AM WHERE Parent_AMI_ID IS NULL
UNION ALL
SELECT d.*, c.Level + 1 FROM cte c
JOIN @DIM_AM d ON c.AMI_ID = d.Parent_AMI_ID)
First part is starting point where you select top level elements(WHERE Parent_AMI_ID IS NULL
):
SELECT *, 0 AS Level FROM @DIM_AM WHERE Parent_AMI_ID IS NULL
Then by syntax you need union all
.
Then comes recursive part that selects children of previous select:
SELECT d.*, c.Level + 1 FROM cte c
JOIN @DIM_AM d ON c.AMI_ID = d.Parent_AMI_ID