0

次のように、正規化されたテーブル(テーブルa)と正規化されていないテーブル(テーブルb)があります。

ここに画像の説明を入力してください

非正規化テーブルの各親の正規化テーブルに新しい行を挿入したいと思います。したがって、studentIDの2つの親を持つテーブルBにレコードがある場合、テーブルBとは異なる親名を持つ2つのレコードをテーブルAに挿入します。

私はこれに何時間も苦労してきました、これを行う方法について助けていただければ幸いです。

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いずれにせよ、列が正規化されたテーブルのキーである理由がよくわかりません。このままでは、同じ親が自分に関連する複数の生徒を持つことはできませんか?、キーはparentIDstudentID? の組み合わせである必要があります。

于 2012-07-25T15:29:06.010 に答える
0

これが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
于 2012-07-25T15:31:57.747 に答える