これでかなり理解できるはずです...しかし、私はロジックを完全には理解していないことを認めなければなりません.なぜ 9401/Acc12 で "HasChild" が 1 に設定されているのですか?
これで試してみてください。番号付けは、SourceCast によって分割されます。つまり、SourceCast に応じて、両方のセット (または多くのセットがそれぞれ 1 つのセットとして扱われます。さらに、例のように実行中の ID があります:
CREATE TABLE Account(AccountID NVARCHAR(50) NOT NULL ,AccountName NVARCHAR(50) NOT NULL ,SourceCast INTEGER NOT NULL ,PRIMARY KEY (AccountID,SourceCast)); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'11',N'Acc11',9401); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'12',N'Acc12',9401); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'13',N'Acc13',9401); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'11/11',N'Acc11/11',9401); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'11/12',N'Acc11/12',9401); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'11/111',N'Acc11/111',9401); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'11/11/001',N'Acc11/11/001',9401); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'11/11/002',N'Acc11/11/002',9401); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'15',N'Acc15',9402); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'12',N'Acc12',9402); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'13',N'Acc13',9402); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'15/15',N'Acc15/15',9402); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'15/12',N'Acc15/12',9402); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'15/111',N'Acc15/111',9402); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'15/15/001',N'Acc15/15/001',9402); INSERT INTO Account(AccountID,AccountName,SourceCast) VALUES (N'15/15/002',N'Acc15/15/002',9402);GOWITH DistinctSourceCasts AS (SELECT DISTINCT SourceCast FROM Account)SELECT *INTO #tempHierarchyFROM( SELECT SourceCast ,CAST(SourceCast AS NVARCHAR(50)) AS AccountID ,CAST(SourceCast AS NVARCHAR(50)) AS AccountName ,0 AS ID ,0 AS HierarchyLevel ,'' AS ParentPath ,'' AS ownID ,'' AS 祖先ID FROM DistinctSourceCasts UNION ALL SELECT SourceCast ,AccountID ,AccountName ,ROW_NUMBER() OVER(PARTITION BY SourceCast ORDER BY LEN(AccountID)-LEN(REPLACE(AccountID,'/','')),AccountID) AS ID ,Extended.HierarchyLevel ,STUFF( ( SELECT '/' + A.B.value('.','varchar(10)') FROM Extended.IDsXML.nodes('/x[position() <=sql:column("HierarchyLevel")]') AS A( B) FOR XML PATH('') ),1,2,'') AS ParentPath ,Extended.IDsXML.value(' /x[sql:column("HierarchyLevel")+1][1]','varchar(10)') AS ownID ,Extended.IDsXML.value('/x[sql:column("HierarchyLevel")][1 ]','varchar(10)') AS 祖先 ID FROM アカウント CROSS APPLY(SELECT LEN(AccountID)-LEN(REPLACE(AccountID,'/','')) + 1 AS HierarchyLevel ,CAST('' + REPLACE(AccountID,'/',' ') + ' ' AS XML) AS IDsXML) AS 拡張) AS tbl;UPDATE #tempHierarchy SET ParentPath =SourceCast,ancestorID=SourceCast WHERE HierarchyLevel=1;UPDATE #tempHierarchy SET ownID=SourceCast WHERE HierarchyLevel=0;WITH RecursiveCTE AS( SELECT th.* ,CAST(NULL AS BIGINT) AS ParentID ,CASE WHEN EXISTS(SELECT 1 FROM #tempHierarchy AS x WHERE x.ParentPath=th.AccountID) THEN 1 ELSE 0 END AS HasChild FROM #tempHierarchy AS th WHERE th.HierarchyLevel=0 UNION ALL SELECT r.SourceCast ,sa.AccountID ,sa.AccountName ,sa.ID ,sa.HierarchyLevel 、sa.ParentPath、sa.ownID、sa.an cestorID ,(SELECT x.ID FROM #tempHierarchy AS x WHERE x.AccountID=sa.ParentPath) ,CASE WHEN EXISTS(SELECT 1 FROM #tempHierarchy AS x WHERE x.ParentPath=sa.AccountID) THEN 1 ELSE 0 END AS HasChild FROM RecursiveCTE AS r INNER JOIN #tempHierarchy AS sa ON sa.HierarchyLevel=r.HierarchyLevel+1 AND r.AccountID=sa.ParentPath AND r.SourceCast=sa.SourceCast)SELECT SourceCast ,r.AccountID ,r.AccountName ,ROW_NUMBER() OVER(ORDER BY SourceCast,HierarchyLevel,ParentID,ID) AS ID ,r.ID AS GroupedID ,r.ParentID ,r.HierarchyLevel ,r.HasChildFROM RecursiveCTE AS rDROP TABLE #tempHierarchy;
結果:
<前>+------------+-----------+--------------+--- ---------------+----------+----------------+-------- --+|ソースキャスト |アカウント ID |アカウント名 | ID |グループ ID |親 ID |階層レベル | HasChild |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9401 | 9401 | 9401 | 1 | 0 |ヌル | 0 | 1 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9401 | 11 | Acc11 | 2 | 1 | 0 | 1 | 1 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9401 | 12 | Acc12 | 3 | 2 | 0 | 1 | 0 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9401 | 13 | Acc13 | 4 | 3 | 0 | 1 | 0 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9401 | 11/11 | Acc11/11 | 5 | 4 | 1 | 2 | 1 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9401 | 11/111 | Acc11/111 | 6 | 5 | 1 | 2 | 0 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9401 | 11/12 | Acc11/12 | 7 | 6 | 1 | 2 | 0 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9401 | 11/11/001 | Acc11/11/001 | 8 | 7 | 4 | 3 | 0 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9401 | 11/11/002 | Acc11/11/002 | 9 | 8 | 4 | 3 | 0 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9402 | 9402 | 9402 | 10 | 0 |ヌル | 0 | 1 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9402 | 12 | Acc12 | 11 | 1 | 0 | 1 | 0 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9402 | 13 | Acc13 | 12 | 2 | 0 | 1 | 0 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9402 | 15 | Acc15 | 13 | 3 | 0 | 1 | 1 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9402 | 15/111 | Acc15/111 | 14 | 4 | 3 | 2 | 0 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9402 | 15/12 | Acc15/12 | 15 | 5 | 3 | 2 | 0 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9402 | 15/15 | Acc15/15 | 16 | 6 | 3 | 2 | 1 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9402 | 15/15/001 | Acc15/15/001 | 17 | 7 | 6 | 3 | 0 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+| 9402 | 15/15/002 | Acc15/15/002 | 18 | 8 | 6 | 3 | 0 |+------------+-----------+--------------+----+-- ------+----------+----------------+----------+コード>