Điều này có thể được thực hiện trong SQL Server 2005 trở lên bằng cách sử dụng Biểu thức Bảng Chung (CTE). Đây là một liên kết tuyệt vời từ MSDN mô tả các truy vấn đệ quy: Truy vấn đệ quy Sử dụng Biểu thức Bảng Phổ biến
Đây là một ví dụ:
Nếu bạn tưởng tượng một dòng người có thứ bậc, truy vấn này sẽ cho bạn thấy dòng người hoàn chỉnh của bất kỳ người nào VÀ tính toán vị trí của họ trong hệ thống thứ bậc. Nó có thể được sửa đổi để tìm bất kỳ mối quan hệ con nào.
Thay vì ID của một người, bạn hoán đổi ID của hàng mà bạn đang sử dụng làm cha mẹ của mình.
--Create table of dummy data
create table #person (
personID integer IDENTITY(1,1) NOT NULL,
name varchar(255) not null,
dob date,
father integer
);
INSERT INTO #person(name,dob,father)Values('Pops','1900/1/1',NULL);
INSERT INTO #person(name,dob,father)Values('Grandma','1903/2/4',null);
INSERT INTO #person(name,dob,father)Values('Dad','1925/4/2',1);
INSERT INTO #person(name,dob,father)Values('Uncle Kev','1927/3/3',1);
INSERT INTO #person(name,dob,father)Values('Cuz Dave','1953/7/8',4);
INSERT INTO #person(name,dob,father)Values('Billy','1954/8/1',3);
DECLARE @OldestPerson INT;
SET @OldestPerson = 1; -- Set this value to the ID of the oldest person in the family
WITH PersonHierarchy (personID,Name,dob,father, HierarchyLevel) AS
(
SELECT
personID
,Name
,dob
,father,
1 as HierarchyLevel
FROM #person
WHERE personID = @OldestPerson
UNION ALL
SELECT
e.personID,
e.Name,
e.dob,
e.father,
eh.HierarchyLevel + 1 AS HierarchyLevel
FROM #person e
INNER JOIN PersonHierarchy eh ON
e.father = eh.personID
)
SELECT *
FROM PersonHierarchy
ORDER BY HierarchyLevel, father;
DROP TABLE #person;