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

Truy vấn dữ liệu cấu trúc cây trong SQL Server

Tôi không nghĩ rằng có gì sai trong thiết kế, giả sử bạn có một mức độ hạn chế của mối quan hệ cha mẹ và con cái. Dưới đây là một ví dụ nhanh về việc truy xuất mối quan hệ bằng cách sử dụng CTE đệ quy:

USE tempdb;
GO

CREATE TABLE dbo.tree
(
    ID INT PRIMARY KEY,
    name VARCHAR(32),
    ParentID INT FOREIGN KEY REFERENCES dbo.tree(ID)
);

INSERT dbo.tree SELECT 1, 'grandpa', NULL
UNION ALL SELECT 2, 'dad', 1
UNION ALL SELECT 3, 'me', 2
UNION ALL SELECT 4, 'mom', 1
UNION ALL SELECT 5, 'grandma', NULL;

;WITH x AS
(
    -- anchor:
    SELECT ID, name, ParentID, [level] = 0
    FROM dbo.tree WHERE ParentID IS NULL
    UNION ALL
    -- recursive:
    SELECT t.ID, t.name, t.ParentID, [level] = x.[level] + 1
    FROM x INNER JOIN dbo.tree AS t
    ON t.ParentID = x.ID
)
SELECT ID, name, ParentID, [level] FROM x
ORDER BY [level]
OPTION (MAXRECURSION 32);
GO

Đừng quên dọn dẹp:

DROP TABLE dbo.tree;

Đây có thể là một bài viết hữu ích. Một giải pháp thay thế là hierarchyid nhưng tôi thấy nó quá phức tạp đối với hầu hết các tình huống.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách sử dụng Tổng, Trung bình và Đếm trong Câu lệnh Chọn - Hướng dẫn SQL Server / TSQL Phần 128

  2. STATISTICS XML trong SQL Server là gì?

  3. Linq lựa chọn phạm vi hồ sơ

  4. 3 cách trả về số lượng hàng trong mỗi phân vùng trong SQL Server (T-SQL)

  5. Truyền một biến vào mệnh đề IN trong một hàm SQL?