sql >> Database >  >> RDS >> Sqlserver

Gebruik SQL om een ​​boomstructuur te klonen die in een database wordt weergegeven

Probeer dit, op basis van een zoekopdracht van Quassnoi 's artikel Aangrenzende lijst versus geneste sets :SQL Server :

WITH q AS
(
    SELECT  h.*, 1 AS level
    FROM    Table1 h
    WHERE   id = 3
    UNION ALL
    SELECT  hp.*, level + 1
    FROM    q
    JOIN    Table1 hp
    ON      hp.id = q.ParentGroupID
), q2 AS (
    SELECT
        ID,
        ParentGroupID,
        SomeValue,
        (SELECT MAX(level) FROM q) - level AS level
    FROM q
)
INSERT INTO table1
SELECT
    (SELECT MAX(ID) FROM Table1) + level + 1 AS ID,
    CASE WHEN level = 0 THEN -1
         ELSE (SELECT MAX(ID) FROM Table1) + level
    END AS ParentGroupID,
    SomeValue + '-cloned'
FROM    q2

Resultaat bij uitvoering op uw testgegevens:

ID  ParentGroupID  SomeValue  
1   -1             a          
2   1              b          
3   2              c          
4   -1             a-cloned
5   4              b-cloned
6   5              c-cloned


  1. Postgres instelling autocommit wereldwijd uit

  2. Waarom geeft Delphi (Zeos) mij brede velden in SQLite als ik om een ​​niet-ondertekende big int vraag?

  3. CREATE FUNCTION-fout Deze functie heeft geen DETERMINISTIC, NO SQL of LEES SQL DATA

  4. In Postgresql hoe te bestellen op datum met behoud van de aangepaste datumnotatie