带大小写的SQL更新,分配或不执行任何操作

带大小写的SQL更新,分配或不执行任何操作,sql,sql-server-2008,sql-update,Sql,Sql Server 2008,Sql Update,在这个问题的后面,有没有一种方法可以将一个CASE语句放入一个SQLUPDATE语句中,该语句要么更新,要么什么也不做。目前我有以下几点: UPDATE CustomerAddress SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE 0 END FROM CustomerAddress join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=

在这个问题的后面,有没有一种方法可以将一个
CASE
语句放入一个SQL
UPDATE
语句中,该语句要么更新,要么什么也不做。目前我有以下几点:

UPDATE CustomerAddress
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE 0 END
FROM CustomerAddress
join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master]
join CustomerAddress c2 on p1.[Id to delete]=c2.Id 
问题出现在这一行:

SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE **0** END
当我将其设置为0时,否则。更新应该检查第一个条件,如果是,则设置为1,但是,如果不满足该条件,我不想设置为0,我需要保留原始值

SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE *CustomerAddress.IsPrimary* END
但是不起作用,因为它从
from
语句中获取值,而不是当前设置的值。我想要的是这样的东西

SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE *Do nothing* END
但这仍然是一个赋值,并尝试设置为
NULL

这是可能的吗

更新:

样本数据:

表示地址的一对ID

ID to keep  ID to delete
------------------------
10          21
10          22
11          31
12          41
我将关注10的情况。因此,10个具有
IsPrimaryAddress=0
,21个具有
IsPrimaryAddress=1
,22个具有
IsPrimaryAddress=0

我相信会发生以下情况(在伪代码中):

设置IsPrimaryAddress=如果21.IsPrimaryAddress=1,则设置为21.IsPrimaryAddress,否则设置为10.IsPrimaryAddress

所以我们将10.IsPrimaryAddress设置为1。现在:

设置IsPrimaryAddress=如果22.IsPrimaryAddress=1,则设置为22.IsPrimaryAddress,否则设置为10.IsPrimaryAddress

我希望10.IsPrimaryAddress等于1。但它似乎获得了原始值0,现在更新已丢失

UPDATE c
SET IsPrimaryAddress = CASE 
  WHEN c2.IsPrimaryAddress = 1 THEN 1 
  ELSE c.IsPrimaryAddress
END
FROM dbo.CustomerAddress AS c
INNER JOIN #AddressToDeleteMasterOfLesserId AS p1 
  ON c.Id = p1.[Id that is master]
INNER JOIN dbo.CustomerAddress AS c2 
  ON p1.[Id to delete] = c2.Id;

PS:我不确定表名,但想法是返回列值本身以保持不变,这是一种常见做法。

只需添加WHERE子句,以便只更新需要更新的行:

UPDATE CustomerAddress c1
  INNER JOIN #AddressToDeleteMasterOfLesserId p1 ON c1.Id = p1.[Id that is master]
  INNER JOIN CustomerAddress c2 ON p1.[Id to delete] = c2.Id
  SET c1.IsPrimaryAddress = 1
  WHERE c2.IsPrimaryAddress = 1

你能解释一下
中的值与
中的值与“值当前已设置为”有什么不同吗?请参阅我对你答案的评论,希望这能解释我的想法。请在两个表中发布示例数据,以及你希望源表的外观。单词问题和理论很难解决。如果你做了大量的更新查询,请查看MERGE语句。它允许您显式处理匹配/不匹配时发生的情况。不幸的是,网上图书有点。。。我发现在这个话题上比平常更难理解。记住“使用”意味着“加入”,这对你来说可能会更快。检查一下,如果你是interested@LevinMagruder谢谢,我会调查的,我见过它出现过几次,但老实说,我浏览了一下,认为“我稍后会再讨论这个…”不幸的是,这给出了一个错误,说
IsPrimaryAddress
是含糊不清的,这是因为CustomerAddress表在joinJust前缀中按表名使用了两次,
CustomerAddress
或者哪个是正确的?!然后我发现Aaron的答案有问题,它可能会设置错误的值,因为它不是查看更新值,而是查看来自语句的
。您需要展示一个示例,因为我认为很多人都不理解您的意思。我放了一些我认为发生了什么的示例数据,我的意思是“认为”我不是sql专家,但我已经像上面那样运行了好几次,并且不断得到不同的答案来支持理论问题,这似乎是从数据中挑选出来的,然后从中进行更新。然后让它查看可能已经更新的数据,因此c(1)最初为0,更新为1,但在情况不正确的情况下进行另一次检查,然后转到
否则c.IsPrimaryAddress
,它不查看更新数据,并将其设置回0,这不是我想要的。一次更新不应该在同一个表中进行多次传递。你证明了你的理论了吗,还是只是一个理论?你能在base和#temp表中发布一些示例数据来演示这一点吗?哈哈。。。。这实际上非常有效。。。这并没有完全涵盖我是否可以用上面的案例陈述来做这件事,但如果没有人想出一个方法来做,我会接受这个answer@dann.dev这种方法也应该更有效,例如,如果没有依赖的主地址,它将不会写入任何内容。是的,这绝对是一种更好的方法,有一种感觉,我最近一直试图对我的SQL太狡猾,没想到这会是一个案例陈述,让我虽然!
UPDATE CustomerAddress c1
  INNER JOIN #AddressToDeleteMasterOfLesserId p1 ON c1.Id = p1.[Id that is master]
  INNER JOIN CustomerAddress c2 ON p1.[Id to delete] = c2.Id
  SET c1.IsPrimaryAddress = 1
  WHERE c2.IsPrimaryAddress = 1