Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Lấy đệ quy tất cả dữ liệu dựa trên id cha

Đ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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server v.Next:Hiệu suất STRING_AGG, Phần 2

  2. Kiểu dữ liệu SYSNAME trong SQL Server là gì?

  3. SQL Server:Cách tốt nhất để Di chuyển dữ liệu là gì?

  4. Số lượng TSQL riêng biệt

  5. Truy vấn chuyển đổi số mũ thành số trôi nổi trong SQL Server