首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> SQL Server 2005

SQL Server 2005 樹狀資料遞迴查詢:父欄位為逗號分隔多父節點

     編輯:SQL Server 2005

資料結構

Id  Name  Parent
1   A     0
2   B     0
3   a1    1,2   -- 同時屬於 A、B

遞迴 CTE 解法

WITH cte AS (
    SELECT * FROM tb WHERE Id = '1'   -- 起始節點
    UNION ALL
    SELECT tb.* FROM tb
    INNER JOIN cte ON CHARINDEX(CAST(cte.Id AS VARCHAR(10)), tb.Parent) > 0
)
SELECT * FROM cte;

原理解析

  • CHARINDEX(CAST(cte.Id AS VARCHAR), tb.Parent) > 0 判斷父欄位是否包含目前節點 Id。
  • 遞迴向下展開所有子孫節點。
  • 注意:若資料量大、層級深,CHARINDEX 掃描效能較差,建議正規化為關聯表。

改良版:防止循環引用

WITH cte AS (
    SELECT *, CAST(',' + CAST(Id AS VARCHAR(10)) + ',' AS VARCHAR(MAX)) AS Path
    FROM tb WHERE Id = '1'
    UNION ALL
    SELECT tb.*, cte.Path + CAST(tb.Id AS VARCHAR(10)) + ','
    FROM tb INNER JOIN cte
        ON CHARINDEX(',' + CAST(cte.Id AS VARCHAR(10)) + ',', ',' + tb.Parent + ',') > 0
    WHERE cte.Path NOT LIKE '%,' + CAST(tb.Id AS VARCHAR(10)) + ',%'
)
SELECT * FROM cte;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved