Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 规范化具有不同结构的表_Sql_Sql Server_Database_Tsql_Database Normalization - Fatal编程技术网

Sql 规范化具有不同结构的表

Sql 规范化具有不同结构的表,sql,sql-server,database,tsql,database-normalization,Sql,Sql Server,Database,Tsql,Database Normalization,我有一个规范化表(表a)和一个非规范化表(表b),如下所示: 我想为非规范化表中的每个父级在规范化表中插入一个新行。因此,如果表B中有一条记录,其中一个studentID有两个父项,我想在表a中插入两条记录,每个记录的父项名称与表B中的不同 我已经为此苦苦挣扎了几个小时,如果您能提供帮助,我们将不胜感激。假设parentID是一个自动增量列,您可以这样做: INSERT INTO NormalizedFamily(studentID, parentName) SELECT studentID,

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

我想为非规范化表中的每个父级在规范化表中插入一个新行。因此,如果表B中有一条记录,其中一个studentID有两个父项,我想在表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
的意义所在。对于初学者来说,这有点奇怪,很难理解。这里有一个完全黑的方法来做同样的事情,应该很容易理解:

 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

用于将数据从一个表插入另一个表的sql查询。能否以文本格式添加表布局?我看不到图像。我用pivot更新了我的答案。我身边没有sql server可以试用它,但如果它不起作用,请告诉我它会给您带来什么错误。看起来您有复制粘贴错误,并且无法为union子句排列列名。@Militimic-是的,复制粘贴从来都不是我的朋友。谢谢实际上,在本例中,它将是
UNPIVOT
它表示无效的对象名称“Parent”。@user1319343,我刚刚加入到一个表中,我认为您的模式中有一个表。如果没有父表,如何获取parentId?