sql:重复行和所有相关行

arm*_*men 6 sql sql-server sql-server-2012

我有以下 3 个相关表

Schools           Departments          Classes
---------------   ------------------   -----------------
ID                ID                   ID
School_Name       ID_Schools           ID_Departments
                  Department_Name      Class_Name
Run Code Online (Sandbox Code Playgroud)

和一些关于它们包含的内容的样本(我会尽可能地画出来)

---- Schools ---
ID   School_Name
----------------
 1   School_1  <----------------------\
 2   School_2                         |
 n   ........                         |
                                      |
---- Departments ----------------     |
ID   ID_Schools   Department_Name     |
---------------------------------     |
 1            1   Dept_1  <-----------/ -->--\
 2            1   Dept_2  <-----------/ -->--|------\
 3            2   Dept_1                     |      |
 n           ..   ......                     |      |
                                             |      |
---- Classes -------------------             |      |
ID   ID_Departments   Class_Name             |      |
--------------------------------             |      |
 1                1   Class_1  <-------------/      |
 2                1   Class_2  <-------------/      |
 3                1   Class_3  <-------------/      |
 4                2   Class_1  <--------------------/
 n               ..   .......
Run Code Online (Sandbox Code Playgroud)

所有 ID 都是自动递增的

我正在寻找一种复制“School_1”层次结构的方法。问题是我如何保持新行之间的关系?

例如,要复制“School_1”层次结构,我将在 Schools 表中插入一个新的原始数据,最终会生成一个新 ID(例如 5)。

---- Schools ---
ID   School_Name
----------------
 5   School_1
Run Code Online (Sandbox Code Playgroud)

属于“School_1”的部门“Dept_1”和“Dept_2”将获得新的 ID

---- Departments ----------------
ID   ID_Schools   Department_Name
---------------------------------
16            5   Dept_1
17            5   Dept_2
Run Code Online (Sandbox Code Playgroud)

并且课程也将获得新的 ID

---- Classes -------------------
ID   ID_Departments   Class_Name
--------------------------------
56               16   Class_1
57               16   Class_2
58               16   Class_3
59               17   Class_1
Run Code Online (Sandbox Code Playgroud)

我怎样才能以一种简单而聪明的方式实现这一目标?

d.s*_*iev 0

我建议使用 SQLINSERT AS SELECT魔法,如下所述:Insert into...values (SELECT...FROM...)

假设您的旧学校 ID 为 7,新学校 ID 为 17,那么您可以为每个表创建一个查询,如下所示INSERT INTO Departments(id, id_schools, name) VALUES (NULL, 17, (SELECT name FROM Departments WHERE id_schools = 17))

当您需要按部门(具有多个部门)插入班级时,它会变得有点棘手,但您可以手动填写WHERE id_departments IN (5,6,13, etc)或自动填写WHERE id_departments IN (SELECT id FROM Departments WHERE School_ID = 17)

PS:这更像是建议,而不是答案,因此一些细节(例如 SQL 方言或代码质量)可能不合适,但我对方法本身很确定。