ソーステーブルからディメンション(SCDタイプ1)を更新/挿入するために使用するTSQLコードがあります。以下は、コードです。
MERGE [dim].[CompanyTest] AS Target
USING [dbo].[DWUSD_LIVE] AS Source
ON Target.Comp = Source.Comp
WHEN MATCHED
AND (ISNULL(Target.[Comp Name],'') <> ISNULL(Source.[Comp Name],'')
OR ISNULL(Target.[Comp Description],'') <> ISNULL(Source.[Comp Description],'')
)
THEN UPDATE SET
[Comp Name] = Source.[Comp Name]
,[Comp Description] = Source.[Comp Description]
,LastUpdated = GetDate()
WHEN NOT MATCHED THEN
INSERT (
Comp
,[Comp Name]
,[Comp Description]
,LastUpdated
) VALUES (
Source.Comp
,Source.[Comp Name]
,Source.[Comp Description]
,GetDate()
);
私のソーステーブルには次のものがあります。
[COMP] [COMP NAME] [COMP DESCRIPTION]
1,100,MyCompany,Service Provider
1,100,MyCompany,Service Provider
1,100,MyCompany,Service Provider
2,200,MyCompany,Service Provider
2,200,MyCompany,Service Provider
2,200,MyCompany,Service Provider
2,200,MyCompany,Service Provider
上記のTSQLを1回実行すると、ディメンションで次のようになります。
[COMP] [COMP NAME] [COMP DESCRIPTION]
1,100,MyCompany,Service Provider
1,100,MyCompany,Service Provider
1,100,MyCompany,Service Provider
2,200,MyCompany,Service Provider
2,200,MyCompany,Service Provider
2,200,MyCompany,Service Provider
2,200,MyCompany,Service Provider
最初の問題は、これを再実行しようとすると、次のようになります。
メッセージ8672、レベル16、状態1、行1 MERGEステートメントが、同じ行を複数回UPDATEまたはDELETEしようとしました。これは、ターゲット行が複数のソース行と一致する場合に発生します。MERGEステートメントは、ターゲットテーブルの同じ行を複数回更新/削除することはできません。ON句を調整して、ターゲット行が最大で1つのソース行と一致するようにするか、GROUPBY句を使用してソース行をグループ化します。
ステートメントに「GROUPBY」を挿入する必要があることを理解しています。これを実行して、ソーステーブルから個別の行のみを取得するようにするにはどうすればよいですか。
次に、私のディメンションには次のものだけが必要です。
[COMP] [COMP NAME] [COMP DESCRIPTION]
1,100,MyCompany,Service Provider
2,200,MyCompany,Service Provider