Sql server 如果When不为true,则不执行任何操作的Case语句
我试图从包含多次出现的accountID的表中更新具有唯一accountID的表。例如,表B中的accountID 1出现一次,表A中的accountID 1出现5次 所以本质上我要从多行更新到一行,所有数据都在这一行上 例如: 表A具有每个accountID的多条记录Sql server 如果When不为true,则不执行任何操作的Case语句,sql-server,Sql Server,我试图从包含多次出现的accountID的表中更新具有唯一accountID的表。例如,表B中的accountID 1出现一次,表A中的accountID 1出现5次 所以本质上我要从多行更新到一行,所有数据都在这一行上 例如: 表A具有每个accountID的多条记录 accountID site hard soft 1 12 20 0 1 13 30 10 1 14 40 0
accountID site hard soft
1 12 20 0
1 13 30 10
1 14 40 0
我需要更新表B,它只有accountID,没有其他数据。看起来是这样的:
accountID site12_hard site12_soft site13_hard site13_soft site14_hard site14_soft
1
update table B set
site12_hard = case when site = 12 then hard else 0 end,
site12_soft = case when site = 12 then soft else 0 end,
from table A inner join table B on accountID = accountID
因此,我在accountID上进行了链接,并对所有字段进行了case语句。像这样:
accountID site12_hard site12_soft site13_hard site13_soft site14_hard site14_soft
1
update table B set
site12_hard = case when site = 12 then hard else 0 end,
site12_soft = case when site = 12 then soft else 0 end,
from table A inner join table B on accountID = accountID
这不正常,因为accountID上的一对多链接导致case语句对该accountID的每次出现进行求值。因此,它可能会在site12上正确更新,但当它移动到accountID=1的下一条记录时,它不再是site=12,因此它会更新为零
我需要一种方法,使案例陈述在时间不正确的情况下什么也不做。或者我需要一个完全不同的方法来更新这个表 我只做了12号和13号站点,14号站点也要做。试试这个
UPDATE B
SET site12_hard = a.site12_hard,
site12_soft = a.site12_soft,
site13_hard = a.site13_hard,
site13_soft = a.site13_soft
FROM tableB B
INNER JOIN (SELECT accountID,
Max(CASE WHEN [site] = 12 THEN hard END) site12_hard,
Max(CASE WHEN [site] = 12 THEN soft END) site12_soft,
Max(CASE WHEN [site] = 13 THEN hard END) site13_hard,
Max(CASE WHEN [site] = 13 THEN soft END) site13_soft
FROM tableA
GROUP BY accountID) a
ON a.accountID = b.accountID
谢谢你编辑这篇文章。我不知道如何更新表示例。要么筛选不希望使用WHERE子句更新的行,要么将列设置为自身,即当前值,无更改。使用..when 12然后hard else site 12_hard..我想您可以使用这样的子查询:SELECT CASE when exists从表a中选择1,其中B.accountID=a.accountID和a.site=12而不是join。我尝试了Yuck的建议,因为它看起来合理,但不起作用。似乎只要案例得到满足并更新给定accountID的字段,它就会继续。