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

Liệt kê tất cả Cha mẹ của một mục trong bảng phân cấp dưới dạng chuỗi phân tách SQL

Điều này dường như làm được các thủ thuật. Điều quan trọng là nhận ra rằng chúng ta có thể xây dựng con đường theo kiểu ngược và dừng lại khi chúng ta không còn cha mẹ để định vị:

DECLARE @t table (ID int not null, Name varchar(19) not null, ParentID int null)
insert into @t(ID,Name,ParentID) values
(1 ,'Alex',null),
(2 ,'John',null),
(3 ,'Don',1),
(4 ,'Philip',2),
(5 ,'Shiva',2),
(6 ,'San',3),
(7 ,'Antony',6),
(8 ,'Mathew',2),
(9 ,'Cyril',8),
(10,'Johan',9)

declare @search table (ID int not null)
insert into @search (ID) values (7),(10)

;With Paths as (
    select s.ID as RootID,t.ID,t.ParentID,t.Name, CONVERT(varchar(max),t.Name) as Path
    from
        @search s
            inner join
        @t t
            on
                s.ID = t.ID
    union all
    select p.RootID,t.ID,t.ParentID,p.Name, t.Name + '->' + p.Path
    from Paths p
            inner join
        @t t
            on
                p.ParentID = t.ID
)
select * from Paths where ParentID is null

Kết quả:

RootID      ID          ParentID    Name                Path
----------- ----------- ----------- ------------------- ----------------------------
10          2           NULL        Johan               John->Mathew->Cyril->Johan
7           1           NULL        Antony              Alex->Don->San->Antony

(Tôi đã để lại trong các cột bổ sung để giúp hiển thị trạng thái cuối cùng. Truy vấn CTE mà không lọc cũng có thể mang tính hướng dẫn)

Tôi cũng lưu ý rằng tôi thường sẽ không làm việc với các chuỗi được phân tách nếu có thể - nó không phải là một đại diện tuyệt vời khi SQL Server có các loại được thiết kế để làm việc với nhiều giá trị.



  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 thêm Đối tác chuyển đổi dự phòng vào chuỗi kết nối trong VB.NET

  2. SQL Server PIVOT có lẽ?

  3. Làm thế nào để gửi email từ SQL Server?

  4. Lỗi kết nối SQL:System.Data.SqlClient.SqlException (0x80131904)

  5. freebcp:Dữ liệu Unicode có kích thước byte lẻ cho cột. Phải là kích thước byte chẵn