0

我有一个规范化表(表 a)和一个非规范化表(表 b),如下所示:

在此处输入图像描述

我想为非规范化表中的每个父级在规范化表中插入一个新行。因此,如果表 B 中有一条记录,其中有两个父母的学生 ID,我想将两条记录插入表 A,每个记录都来自表 B。

我已经为此苦苦挣扎了好几个小时,对于如何进行此操作的任何帮助将不胜感激。

4

2 回答 2

0

假设parentID是一个自动增量列,你可以这样做:

INSERT INTO NormalizedFamily(studentID, parentName)
SELECT studentID, parentName1
FROM FlatFamily
UNION
SELECT studentID, parentName2
FROM FlatFamily
WHERE parentName2 IS NOT NULL
UNION
SELECT studentID, parentName3
FROM FlatFamily
WHERE parentName3 IS NOT NULL
UNION
SELECT studentID, parentName4
FROM FlatFamily
WHERE parentName4 IS NOT NULL

无论如何,我真的不明白为什么该列parentId是规范化表的键。事实上,同一个父母不能有多个学生与他有关?,键不应该是parentID和的组合studentID吗?。

于 2012-07-25T15:29:06.010 回答
0

这就是unpivot目的。不过对于初学者来说,这有点奇怪和难以理解。这是做同样事情的一种完全hacky的方法,应该很容易理解:

 insert into NormalizedFamily (parentId, studentId, parentName)
 select p.parentName,
        p.parentId,
        f.studentId
   from Parent p
            inner join
        (select studentId, parentName1 as parentName from FlatFamily
         union all
         select studentId, parentName2 as parentName from FlatFamily
         union all
         select studentId, parentName3 as parentName from FlatFamily
         union all
         select studentId, parentName4 as parentName from FlatFamily
         union all
         select studentId, parentName5 as parentName from FlatFamily
        ) t                on t.parentName = p.parentName

这是如何unpivot工作的。它基本上将列变成行。所以试试这个 select 语句:

 SELECT studentId, parentColumnName, parentName
   FROM (SELECT studentId, parentName1, parentName2, parentName3, parentName4, parentName5
           FROM FlatFamily) f
UNPIVOT (parentName FOR parentColumnName IN (parentName1, parentName2, parentName3, parentName4, parentName5)) AS t
于 2012-07-25T15:31:57.747 回答