В SQL Server 2005 и выше, вы можете использовать рекурсивный КТР (пример основанный на this article):
DECLARE @t AS TABLE (domainid INT NOT NULL, domainname VARCHAR(25) NOT NULL, parentdomainid INT NULL);
INSERT INTO @t VALUES (1, 'Law', NULL);
INSERT INTO @t VALUES (3, 'Engineering', NULL);
INSERT INTO @t VALUES (4, 'Medical', NULL);
INSERT INTO @t VALUES (6, 'Civil', 3);
INSERT INTO @t VALUES (7, 'Mechanical', 3);
INSERT INTO @t VALUES (8, 'Dental', 4);
INSERT INTO @t VALUES (9, 'MBBS', 4);
INSERT INTO @t VALUES (12, 'Cavity', 8);
-- SELECT * FROM @t;
WITH CTE(domainid, parentdomainid, domainname, Depth, SortCol)
AS
(
SELECT domainid, parentdomainid, domainname, 0, CAST(domainid AS varbinary(max))
FROM @t
WHERE parentdomainid IS NULL
UNION ALL
SELECT d.domainid, d.parentdomainid, d.domainname, p.Depth + 1,
CAST(SortCol + CAST(d.domainid AS binary(4)) AS varbinary(max))
FROM @t AS d
JOIN CTE AS p
ON d.parentdomainid = p.domainid
)
SELECT domainid, parentdomainid, domainname, Depth, REPLICATE('--', Depth) + domainname as displayname
FROM CTE
ORDER BY SortCol;
@Cade Roux: Спасибо за запрос. Не могли бы вы дать мне знать, какова роль SortCol здесь. –
@vaibhav Посмотрите на него без ORDER BY. Без ORDER BY вам не гарантируется какой-либо конкретный порядок. Если вы добавите SortCol в SELECT, вы увидите, что он делает. Он просто использует шестнадцатеричное представление с фиксированной шириной, чтобы сделать сортировку правильной. Если бы вы не заполняли конкатенированные числа вообще (скажем, в десятичной форме, с простой конкатенацией), 1,21 - 121 и 12,1 - 121, и, разумеется, сортировка была бы беспорядочной. –