sql >> Databasteknik >  >> RDS >> Sqlserver

Använd SQL för att klona en trädstruktur som representeras i en databas

Prova detta, baserat på en fråga från Quassnoi s artikel Adjacency List vs Nested 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

Resultat när du kör på dina testdata:

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. Hur man söker och ersätter alla instanser av en sträng i en databas?

  2. Prestandaöverväganden för temporär data i Oracle

  3. Hur make_time() fungerar i PostgreSQL

  4. Php mysql pdo-fråga:fyll i variabel med frågeresultat