次のように、正規化されたテーブル(テーブルa)と正規化されていないテーブル(テーブルb)があります。
非正規化テーブルの各親の正規化テーブルに新しい行を挿入したいと思います。したがって、studentIDの2つの親を持つテーブルBにレコードがある場合、テーブルBとは異なる親名を持つ2つのレコードをテーブルAに挿入します。
私はこれに何時間も苦労してきました、これを行う方法について助けていただければ幸いです。
次のように、正規化されたテーブル(テーブルa)と正規化されていないテーブル(テーブルb)があります。
非正規化テーブルの各親の正規化テーブルに新しい行を挿入したいと思います。したがって、studentIDの2つの親を持つテーブルBにレコードがある場合、テーブルBとは異なる親名を持つ2つのレコードをテーブルAに挿入します。
私はこれに何時間も苦労してきました、これを行う方法について助けていただければ幸いです。
が自動増分列であると仮定する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