sql >> Database teknologi >  >> RDS >> Sqlserver

Opret træforespørgsel fra numerisk kortlægningstabel i SQL (med separatorfelt)

Dette burde komme dig ret tæt på... Men jeg må indrømme, at jeg ikke helt forstår logikken... Hvorfor er der på 9401/Acc12 "HasChild" sat til 1?

Prøv det med dette. Nummereringen er opdelt af SourceCast. Det betyder, at begge sæt (eller mange sæt behandles som ét sæt hver, afhængigt af SourceCast. Derudover er der et kørende ID, som i dit eksempel:

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 ,''S ancestorID 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 ancestorID FRA Account CROSS APPLY(SELECT LEN(AccountID)-LEN(REPLACE(AccountID,'/','')) + 1 AS HierarchyLevel ,CAST('' + REPLACE(AccountID,'/','') + '' AS XML) AS IDsXML) AS Extended) AS tbl;UPDATE #tempHierarchy SET ParentPath =SourceCast,ancestorID=SourceCast WHERE HierarchyLevel=1;OPDATERING #tempHierarchy SET ownID=SourceCast WHERE HierarchyLevel=0;WITH RecursiveCTE AS( SELECT th.* ,CAST(NULL AS BIGINT) AS ParentID ,CASE WHERE EXISTS FROM AS(SELECTHier x WHERE x.ParentPath=th.AccountID) THEN 1 ANDES 0 END AS HasChild FRA #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 NÅR EKSISTERER(SELECT 1 FROM #tempHierarchy AS x WHERE x.ParentPath=sa.AccountID) THEN 1 ANDES 0 END AS HasChild FRA RecursiveCTE AS r INNER JOIN #tempHierarchy AS sa PÅ sa.HierarchyLevel=r.HierarchyLevel+1 OG r.AccountID=sa.ParentPath OG r.SourceCast=sa.SourceCast)VÆLG SourceCast ,r.AccountID ,r.AccountName()ROW_NUMBER ,ROW_NUMBER OVER(ORDER BY SourceCast,HierarchyLevel,PrentID,ID) AS ID ,r.ID AS GroupedID ,r.PrentID ,r.HierarchyLevel ,r.HasChildFROM RecursiveCTE AS rDROP TABLE #tempHierarchy; 

Resultatet:

+------------+------------+-------------+--- --+-----------+----------+----------------+-------- --+| SourceCast | Konto-id | Kontonavn | ID | Grupperet ID | Forældre-ID | Hierarkiniveau | HasChild |+------------+----------------+----+-- ----------+----------+----------------+----------+| 9401 | 9401 | 9401 | 1 | 0 | NULL | 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/11 | 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 | NULL | 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 |+------------+------------------+------ ----------+----------+----------------+----------+


  1. Få den faktiske eksekveringsplan i Oracle 11g

  2. Kontroller, om en IP-adresse er gemt i databasen

  3. Formatering af dato (ÅÅ:MM:DD:Tid) i Excel

  4. Hvordan kontrollerer man rollen for den nuværende PostgreSQL-bruger fra Qt-applikationen?