3

ソーステーブルからディメンション(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
4

2 に答える 2

1

これは簡単です。USINGステートメントの派生テーブルで使用

MERGE [dim].[CompanyTest] AS Target
USING (
       SELECT DISTINCT *
       FROM [dbo].[DWUSD_LIVE]
       ) AS Source
...
于 2012-10-28T08:48:23.143 に答える
0

これで動作します。私の最終的なコードは次のようになります。

MERGE [dim].[CompanyTest] AS Target
USING (
SELECT DISTINCT 
[COMP NAME],
[COMP DESCRIPTION],
[COMP]
FROM [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()
);

近かった!! ありがとう :)

于 2012-10-28T23:34:28.177 に答える