gpt4 book ai didi

sql - 使用 SQL 克隆数据库中表示的树结构

转载 作者:行者123 更新时间:2023-12-02 11:37:24 25 4
gpt4 key购买 nike

给定一个表示分层树结构并具有三列的表

  1. ID(主键,非自动增量)
  2. 父组ID
  3. 一些值(value)

我知道该分支的最低节点,并且我想将其复制到具有相同数量的父级的新分支,也需要克隆。

我正在尝试编写一个 SQL INSERT INTO 语句,该语句会将同一主组的每一行的副本复制到一个新的 GroupID 中。

起始表示例:

ID | ParentGroupID | SomeValue
------------------------
1 | -1 | a
2 | 1 | b
3 | 2 | c

运行简单的 INSERT INTO 语句后的目标:

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

最终的树结构

+--a (1)
| +--b (2)
| +--c (3)
|
+--a-cloned (4)
| +--b-cloned (5)
| +--c-cloned (6)

正如本演示数据所示,ID 并不总是很好地间隔开,因此我不能总是假设父级 ID 比具有父级的行的当前 ID 小 1。

此外,我正在尝试在 T-SQL 中执行此操作(适用于 Microsoft SQL Server 2005 及更高版本)。

这感觉像是一个经典的练习,应该有一个纯 SQL 答案,但我太习惯于在关系 SQL 中思考的编程。

最佳答案

根据来自Quassnoi的查询尝试这个的文章 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

在测试数据上运行时的结果:

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

关于sql - 使用 SQL 克隆数据库中表示的树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2830195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com