我有一个包含数千行的 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_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,我计划进行另一个合并。
我正在尝试使用合并更新表,但我遇到了问题,因为我无法在此处进行唯一选择(不知何故,我也需要 language_id):
ON (
TARGET.provider_id = SOURCE.provider_id AND
TARGET.country_id = SOURCE.country_id
)
错误是:
MERGE 语句多次尝试更新或删除同一行。当目标行匹配多个源行时会发生这种情况。MERGE 语句不能多次 UPDATE/DELETE 目标表的同一行。优化 ON 子句以确保目标行最多匹配一个源行,或使用 GROUP BY 子句对源行进行分组。
我怎样才能完成这项工作并确保所有表都正确更新?(不一定使用合并)从性能的角度来看,最好的方法是什么?(只有 INSERT INTO 会被执行一千次......)