开发者社区 问答 正文

根据源表数据中的条件更新或插入SQL Server目标表数据

我有两个SQL Server表,一个是我的目标表(LocaleStringResource),另一个是源表(TempResourceSunil)。

源表包含以下列:TempResourceSunil

[ID], [LanguageId], [ResourceName], [ResourceValue], [Burmese], [Unicode]

并且目标表的列是LocaleStringResource

[Id], [LanguageId], [ResourceName], [ResourceValue] 我想[ResourceValue]基于[ResourceName]源文件更新目标表。

例:

[ResourceName] = 'Account.AccountActivation'

表示我想检查它是否[ResourceValue]在LocaleStringResource表中有对应的缅甸语(如果不存在),我将从TempResourceSunil缅甸语列中获取它,并LocaleStringResource使用language 将其插入id =2。

同样,如果[ResourceValue]对Unicode(语言ID = 3)不存在为[ResourceName] = 'Account.AccountActivation'手段我想插入[ResourceValue]从TempResourceSunil用语言id = 3。

有任何SQL专家可以帮助我吗?

展开
收起
祖安文状元 2020-01-06 12:01:59 365 分享 版权
阿里云 AI 助理回答

当然,你可以使用MERGE语句或者IF NOT EXISTS结合INSERT来实现这个需求。这里我提供一个使用MERGE的示例,它允许你根据条件执行插入或更新操作。

首先,确保你的源表(TempResourceSunil)中的缅甸语和Unicode列与目标表(LocaleStringResource)的[ResourceValue]有直接可比较的数据结构。接下来是基于你的描述构建的SQL语句:

MERGE LocaleStringResource AS Target
USING (
    SELECT 
        [ResourceName], 
        CASE 
            WHEN T.[Burmese] IS NOT NULL THEN T.[Burmese]
            ELSE T.[Unicode]
        END AS ResourceValue,
        CASE 
            WHEN T.[Burmese] IS NOT NULL THEN 2 -- 缅甸语的LanguageId
            ELSE 3 -- Unicode的LanguageId
        END AS LanguageId
    FROM TempResourceSunil AS T
) AS Source
ON Target.ResourceName = Source.ResourceName AND Target.LanguageId = Source.LanguageId
WHEN NOT MATCHED BY TARGET THEN
    INSERT ([ResourceName], [LanguageId], [ResourceValue])
    VALUES (Source.ResourceName, Source.LanguageId, Source.ResourceValue);

这段SQL做了以下几件事: 1. 它从TempResourceSunil表中选择数据,同时决定每个ResourceName应该使用的ResourceValue和对应的LanguageId。 2. 使用CASE表达式来判断是否使用缅甸语还是Unicode作为ResourceValue,并相应地分配LanguageId。 3. MERGE语句会检查LocaleStringResource表中是否有匹配的ResourceNameLanguageId组合。 4. 如果没有找到匹配项(即WHEN NOT MATCHED BY TARGET),则执行插入操作,将源表中的数据插入到目标表中。

请根据你的实际数据库环境调整上述脚本,特别是检查数据类型和列名是否完全对应。在运行任何修改数据的操作之前,建议先在一个安全的测试环境中验证SQL脚本,以避免意外的数据更改。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答