我有一个规范化表(表 a)和一个非规范化表(表 b),如下所示:
我想为非规范化表中的每个父级在规范化表中插入一个新行。因此,如果表 B 中有一条记录,其中有两个父母的学生 ID,我想将两条记录插入表 A,每个记录都来自表 B。
我已经为此苦苦挣扎了好几个小时,对于如何进行此操作的任何帮助将不胜感激。
我有一个规范化表(表 a)和一个非规范化表(表 b),如下所示:
我想为非规范化表中的每个父级在规范化表中插入一个新行。因此,如果表 B 中有一条记录,其中有两个父母的学生 ID,我想将两条记录插入表 A,每个记录都来自表 B。
我已经为此苦苦挣扎了好几个小时,对于如何进行此操作的任何帮助将不胜感激。
假设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
吗?。
这就是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