Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използвайте SQL, за да клонирате дървовидна структура, представена в база данни

Опитайте това въз основа на заявка от Quassnoi Статия на Списък на съседство срещу вложени набори :SQL сървър :

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

Резултат при изпълнение на вашите тестови данни:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Индекс на SQL Server Кое трябва да бъде групирано?

  2. Услуги за отчитане - име на група в заглавката на страницата

  3. Вмъкнете varbinary данни в базата данни на SQL Server

  4. SQL Server Triggers - групиране по транзакции

  5. Преобразуването на стойността на varchar препълни колона int