2012-10-28 21 views
3

我有,我要用来更新/从源表中插入我的尺寸(SCD型1)TSQL代码,下面是代码:SQL语法的帮助,合并组由数据仓库尺寸

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一次,我在尺寸得到这样的:

[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 

冷杉st问题是,当我尝试重新运行时,我得到:

Msg 8672,Level 16,State 1,Line 1 MERGE语句试图更新或删除同一行多次。当目标行匹配多个源行时会发生这种情况。 MERGE语句不能多次更新/删除目标表的同一行。细化ON子句以确保目标行至多与一个源行匹配,或使用GROUP BY子句对源行进行分组。

我知道我需要在语句中插入一个“GROUP BY”,我该怎么做才能让我只从源表中获得不同的行。

然后我的尺寸应该只有:

[COMP] [COMP NAME] [COMP DESCRIPTION] 
1,100,MyCompany,Service Provider 
2,200,MyCompany,Service Provider 

回答

1

这是simple.Use使用声明派生表

MERGE [dim].[CompanyTest] AS Target 
USING (
     SELECT DISTINCT * 
     FROM [dbo].[DWUSD_LIVE] 
     ) AS Source 
... 
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() 
); 

我太亲密了!谢谢:)