Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如果When不为true,则不执行任何操作的Case语句_Sql Server - Fatal编程技术网

Sql server 如果When不为true,则不执行任何操作的Case语句

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的表中更新具有唯一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
我需要更新表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的字段,它就会继续。