合并语句以删除/更新/插入Sql Server中的数据

时间:2019-05-05 16:15:09

标签: sql-server merge-statement

我有一个具有数千行的excel文件,我需要使用它删除/更新/插入一些表。 excel提供以下数据: provider_id country_name locale property1 property2 。 需要更新的表是: provider_country ,其列为: provider_country_id provider_id country_id property1 property2 provider_country_language ,其列为: provider_country_language_id provider_country_id language_id 。 我还可以将表 country 与列(用于联接)一起使用: country_id country_name 。 并在表 language 中添加列: language_id locale country_id 。 需要更新的字段是country_id,language_id,property1,property2(来自provider_country和provider_country_language)

我用来自excel的所有数据创建了一个临时表:

CREATE TABLE #TempProviderCountryLanguage(
[provider_id] int NULL,
[country_name] nvarchar(50) NULL,
[locale] nvarchar(10) NULL,
[property1] int NULL,
[property2] decimal(5,2) NULL
) 

INSERT INTO #TempProviderCountryLanguage VALUES 
(1,N'Provider1',N'Brazil',N'en-br',4,NULL)
INSERT INTO #TempProviderCountryLanguage VALUES 
(1,N'Provider1',N'Brazil',N'pt-br',4,NULL)
INSERT INTO #TempProviderCountryLanguage VALUES 
(1,N'Provider1',N'Denmark',N'da-dk',4,12.21)
INSERT INTO #TempProviderCountryLanguage VALUES 
(2,N'Provider2',N'Denmark',N'da-dk',5,14.21)
......

MERGE [provider_country] AS TARGET
USING (
SELECT tb.provider_id
    ,c.country_id
    ,l.language_id
    ,tb.property1
    ,tb.property2
FROM #TempProviderCountryLanguage tb
INNER JOIN country c ON c.country_name = tb.country_name
INNER JOIN language l ON l.locale = l.locale
) AS SOURCE
ON (
        TARGET.provider_id = SOURCE.provider_id AND
        TARGET.country_id = SOURCE.country_id
        )
WHEN MATCHED
THEN
    UPDATE
    SET TARGET.country_id = SOURCE.country_id,
        TARGET.property1 = SOURCE.property1,
        TARGET.property2 = SOURCE.property2
WHEN NOT MATCHED BY TARGET
THEN
    INSERT (
        provider_id
        ,country_id
        ,property1
        ,property2
        )
    VALUES (
        SOURCE.provider_id
        ,SOURCE.country_id
        ,SOURCE.property1
        ,SOURCE.property2
        )
WHEN NOT MATCHED BY SOURCE THEN
DELETE;

对于provider_country_language,我计划进行另一次合并。

我正在尝试使用merge更新表,但是有一个问题,因为我无法在此处进行唯一选择(某种程度上,我也需要language_id):

ON (
TARGET.provider_id = SOURCE.provider_id AND
TARGET.country_id = SOURCE.country_id
)

错误是:

  

MERGE语句尝试更多地更新或删除同一行   不止一次。当目标行与多个源匹配时,就会发生这种情况   行。 MERGE语句无法更新/删除目标的同一行   表多次。优化ON子句以确保目标行   最多匹配一个源行,或使用GROUP BY子句进行分组   源行。

如何进行这项工作,并确保所有表都正确更新?(不一定使用合并) 从性能的角度来看,最好的方法是什么? (仅INSERT INTO将执行数千次...)

0 个答案:

没有答案