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

SQL Server CTE -Tìm ID cha mẹ hàng đầu cho mỗi ID con?

Bạn không thể làm điều gì đó như thế này?

;WITH cte AS (....)
SELECT
    * 
FROM 
    cte
CROSS APPLY 
    dbo.myTable tbl ON cte.XXX = tbl.XXX

Đặt CROSS APPLY sau định nghĩa CTE - thành một câu lệnh SQL duy nhất tham chiếu trở lại CTE. Nó sẽ không hoạt động ??

HOẶC: - lướt qua logic của bạn - thực hiện CTE "từ trên xuống", chọn các nút cấp cao nhất trước tiên, và sau đó lặp lại qua quá trình tìm kiếm. Bằng cách này, bạn có thể dễ dàng xác định "cha cấp cao nhất" trong phần đầu tiên của CTE đệ quy - giống như sau:

;WITH ChildParent AS
(
    SELECT
        ID,
        ParentID = ISNULL(ParentID, -1),
        SomeName, 
        PLevel = 1,   -- defines level, 1 = TOP, 2 = immediate child nodes etc.
        TopLevelFather = ID  -- define "top-level" parent node
    FROM dbo.[Agent_Agents] 
    WHERE ParentID IS NULL

    UNION ALL

    SELECT
        a.ID,
        ParentID = ISNULL(a.ParentID, -1),
        a.SomeName, 
        PLevel = cp.PLevel + 1,
        cp.TopLevelFather   -- keep selecting the same value for all child nodes
    FROM dbo.[Agent_Agents] a
    INNER JOIN ChildParent cp ON r.ParentID = cp.ID
)
SELECT  
   ID,
   ParentID,
   SomeName,
   PLevel,
   TopLevelFather   
FROM ChildParent

Điều này sẽ cung cấp cho bạn các nút như thế này (dựa trên dữ liệu mẫu của bạn, mở rộng một chút):

ID  ParentID  SomeName      PLevel  TopLevelFather
20    -1      Top#20           1          20
 4    -1      TOP#4            1           4
 8    -1      TOP#8            1           8
 7     8      ChildID = 7      2           8
 3     7      ChildID = 3      3           8
 2     4      ChildID = 2      2           4
 9    20      ChildID = 9      2          20
 5     9      ChildID = 5      3          20
 1     5      ChildID = 1      4          20

Bây giờ nếu bạn chọn một nút con cụ thể từ đầu ra CTE này, bạn sẽ luôn nhận được tất cả các thông tin mà bạn cần - bao gồm "cấp độ" của nút con và nút cha cấp cao nhất của nó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm khóa chính từ một bảng trong danh sách được phân tách bằng dấu phẩy

  2. Chuyển ra một phân vùng trong SQL Server (T-SQL)

  3. Cách tạo một thủ tục được lưu trữ trong SQL Server

  4. SQL Server:Làm thế nào để gọi một chức năng do người dùng xác định (UDF) trên máy chủ được liên kết?

  5. ADO.Net SQLCommand.ExecuteReader () làm chậm hoặc treo