名前と値のペアのデータを格納するテーブルを、SQL Server 2008 でリレーショナル形式に変換したいと考えています。
ソース テーブル
Strings
ID Type String
100 1 John
100 2 Milton
101 1 Johny
101 2 Gaddar
対象が必要
Customers
ID FirstName LastName
100 John Milton
101 Johny Gaddar
私は以下の戦略に従っています。
顧客テーブルに文字列テーブルの ID 値を入力します
INSERT INTO CUSTOMERS SELECT DISTINCT ID FROM Strings
次のものが得られます
Customers
ID FirstName LastName
100 NULL NULL
101 NULL NULL
ID 列を使用して文字列に結合することにより、残りの属性で Customers を更新します。このように、Customers の各レコードには、対応する 2 つの一致するレコードがあります。
UPDATE Customers
SET FirstName = (CASE WHEN S.Type=1 THEN S.String ELSE FirstName)
LastName = (CASE WHEN S.Type=2 THEN S.String ELSE LastName)
FROM Customers
INNER JOIN Strings ON Customers.ID=Strings.ID
中間状態は似ていますが、
ID FirstName LastName ID Type String
100 John NULL 100 1 John
100 NULL Milton 100 2 Milton
101 Johny NULL 101 1 Johny
101 NULL Gaddar 101 2 Gaddar
しかし、これは期待どおりに機能していません。句で値を割り当てるSET
と、コミットされていない値ではなく、コミットされた値のみが設定されるためです。コミットされていない値を (クエリの処理時間内に)UPDATE
ステートメントに設定する方法はありますか?
PS:代替ソリューションを探しているわけではありませんが、コミットされていないデータをUPDATE
.