当前位置: 首页 > 面试题库 >

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

史智志
2023-03-14
问题内容

给定一个表,该表代表分层树结构并具有三列

  1. ID(主键,非自动递增)
  2. ParentGroupID
  3. 某值

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

我正在尝试编写单个SQL INSERT INTO语句,该语句将使同一主行的每一行的副本是将一个GroupID的一部分复制到新的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并不总是很好地隔开,因此对于具有父级的行,我不能始终假定Parent的ID比当前ID小1。

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

这听起来像是一个经典的练习,应该有一个纯SQL的答案,但是我已经习惯了编程,以至于我在关系型SQL中没有想到。


问题答案:

根据Quassnoi的文章“邻接列表与嵌套集: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


 类似资料:
  • 主要内容:示例在某些情况下,您可能需要一个表的完整、精确副本,也即克隆表(复制表)。我们首先想到的是使用 CREATE TABLE 命令创建一张新表,然后使用 SELECT 命令从旧表中选取所有数据,并使用 INSERT 命令插入到新表中。但是这种做法可能达不到您的目的,因为副本必须包含相同的索引、约束、默认值等。 如果您使用 MySQL 数据库,可以借助 SHOW CREATE TABLE 命令,该命令用来展

  • 假设您是其中一位团队成员,把现有的远程数据库克隆到另一个目录( tutorial2 )。 Windows 请双击桌面上的任意地方,然后从右击菜单中选择“Git克隆”。 点击“Clone Repository" 按钮,再输入要克隆的远程数据库的URL和要保存的本地数据库的目录,然后点击“确定”。 这样就把上一页面中创建的数据库,以“tutorial2”的名称进行了克隆。 克隆将在以下画面开始进行。完

  • 如果远程数据库中有他人的修改记录,那么把它完整地复制下来您就可以接着进行工作了。 克隆 进行克隆(Clone)操作就可以复制远程数据库。 执行克隆后,远程数据库的全部内容都会被下载。之后您在另一台机器的本地数据库上进行操作。 Note 克隆后的本地数据库的变更履历也会被复制,所以可以像原始的数据库一样进行查看记录或其他操作。

  • 问题内容: 我正在使用带有SQL数据库的C#开发应用程序。 我有一个模型: 我想将其表示为表格。 表格的哪些正确字段? 问题答案: 这取决于该人与他将负责的其他人之间存在什么样的关系。 如果是父母与子女的关系,即 组成 关系,则可以使用自我参考表。就像是: 包含以下各列: , 。 相同表的外键。 如果一个人与其他人之间的关系是一个 集合 ,并且一个人可能对其他许多事情负责: , 。 : , , 。

  • Windows 首先,在之前克隆的数据库目录里的sample.txt 添加以下黑体字,并提交。 连猴子都懂的Git命令add 把变更录入到索引中 用tutorial2进行的操作 我们可以看到本地数据库分支的历史记录已更新,并位于远程数据库分支的前面。 用tutorial2进行的操作 接着,让我们推送新提交到远程数据库。请右击目录"tutorial2"并选择“推送”。 用tutorial2进行的操作

  • 本文向大家介绍如何在MySQL中克隆表的结构?,包括了如何在MySQL中克隆表的结构?的使用技巧和注意事项,需要的朋友参考一下 要在MySQL中克隆,请使用LIKE子句。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 输出结果 这将产生以下输出- 以下是在MySQL中克隆表结构的查询- 让我们检查新创建的表的结构- 输出结果 这将产生以下输出-