【问题标题】:MERGE - UPDATE column values separately, based on logic in WHEN MATCHED blockMERGE - 根据 WHEN MATCHED 块中的逻辑单独更新列值
【发布时间】:2012-12-05 04:29:30
【问题描述】:

今天早些时候,我问了this question,得到了我想要的答案。现在我有一个后续问题:

我想要什么:

我希望 MERGE 将目标表中每行的每一列值与源表中的相应值进行比较,并根据 WHEN MATCHED AND 块中 OR 分隔的逻辑进行任何更新。

如果WHEN MATCHED AND 中由OR 分隔的任何 逻辑,恐怕我编写的代码(如下图所示)会在THEN UPDATE SET 块中列出更新块是真的。

如果我的预感是正确的,您对如何重写代码以使其表现得像我希望的那样有什么建议吗?

【问题讨论】:

  • 鉴于本文的长度,如果您将代码发布为代码而不是图像,对我们大多数人来说会更容易。我们可以剪切和粘贴而不是重新输入。
  • 感谢您的建议;将来会做。
  • @user1330266 - 您的问题有一个编辑按钮,因此您可以使用代码而不是图像来更新它。

标签: sql sql-server tsql merge data-warehouse


【解决方案1】:

没有您的数据,也不想从图像中重新输入您的查询,我创建了一个示例,我认为它可以证明您想要什么:

create table t (ID int not null,Col1 int null,Col2 int null)
create table s (ID int not null,Col1 int null,Col2 int null)

insert into t(ID,Col1,Col2) values (1,1,null),(2,null,2)
insert into s(ID,Col1,Col2) values (1,3,4),(2,5,6),(3,7,8)

;merge into t
using s
on t.ID = s.ID
when not matched then insert (ID,Col1,Col2) values (s.ID,s.Col1,s.Col2)
when matched then update
set Col1 = COALESCE(t.Col1,s.Col1),
Col2 = COALESCE(t.Col2,s.Col2)
;
select * from t

结果:

ID          Col1        Col2
----------- ----------- -----------
1           1           4
2           5           2
3           7           8

关键是使用COALESCE 来避免更新已经有的列值(我认为这是您想要实现的目标)

【讨论】:

    【解决方案2】:

    我不确定我是否理解这个问题 - 你的意思是......好吧,我不确定你的意思。减去额外的尾随 OR,您有两个条件。如果其中一个(或两者)评估为 TRUE,则目标表将由 THEN UPDATE 更新

    但是,您正在对 unique_key 进行 MATCH,第一个条件(s.unique_key IS NOT NULL AND t.unique_key IS NULL)永远不会为真,因为如果它为真,那么记录将不会被匹配。所以 OR 的第一部分可以忽略。

    此外,由于记录在 unique_key 上匹配,因此使用 unique_key 的源值更新目标是完全多余的 - 它们已经相同。

    因此,正如目前所写,您的 MERGE 是:

    MERGE dbo.input311 AS T
    USING dbo.input311staging AS S
    ON S.unique_key = S.unique_key
    WHEN NOT MATCHED BY TARGET THEN
       INSERT
         -- insert statement I'm too lazy to type
    WHEN MATCHED AND s.created_date IS NOT NULL AND t.created_date IS NULL THEN
       UPDATE SET t.created_date = s.created_date
    

    【讨论】:

    • 你是绝对正确的。我通过发布修改后的脚本的屏幕截图来编辑 OP,以便将您的观察考虑在内。但是,我最初的问题仍然适用于这个修改后的脚本。如果你有时间,你能再看看这个并提出建议吗?
    • 见 Damien 的回答 - 这就是你要找的吗?
    • 是的,它产生了我需要的结果。再次感谢您的意见。
    猜你喜欢
    • 2016-01-15
    • 1970-01-01
    • 2023-03-03
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多