使用表 B 中相同列中的值更新表 AA 中多列中的值,但前提是满足条件

Update values in multiple columns in table AA with values in the same columns from table B but only if condition is met

提问人:GB1975 提问时间:9/23/2023 最后编辑:Dale KGB1975 更新时间:9/23/2023 访问量:71

问:

我需要使用表 BB 中的信息更新表 AA 中的信息,但前提是 AA=ID4 与 BB=ID4 匹配。以下是当前的表格布局:

更新前:

表AA

ID1 ID2 ID3 ID4 ID5 ID6 ID7

10  11  12  13  0   0   0                    
20  21  22  23  0   0   0                     

表BB

ID1 ID2 ID3 ID4 ID5 ID6 ID7

10  11  12  13  14  15  16                    
20  21  22  23  24  25  26                     

更新后:

表AA

ID1 ID2 ID3 ID4 ID5 ID6 ID7

10  11  12  13  14  15  16                    
20  21  22  23  24  25  26                     

我构建的查询确实更新了信息,但实际上更新了所有行,而不仅仅是其中的行 AA=ID4 匹配 BB=ID4。这是我正在使用的:

UPDATE AA
   Set AA.ID5 = BB.ID5,
    AA.ID6 = BB.ID6,
    AA.ID7 = BB.ID7
From AA
Inner Join BB
        ON AA.ID4 = BB.ID4

请让我知道我错过了什么。

先谢谢你

我尝试了以下建议:

SQL> merge into aa
2    using bb
3    on (aa.id4 = bb.id4
       and aa.id1 = bb.id1
       and aa.id2 = bb.id2
       and aa.id3 = bb.id3)
4    when matched then update set
5      aa.id5 = bb.id5,
6      aa.id6 = bb.id6,
7      aa.id7 = bb.id7;

但是我收到了以下消息:

MERGE 语句多次尝试对同一行执行 UPDATE 或 DELETE 操作。当目标行与多个源行匹配时,会发生这种情况。MERGE 语句不能多次更新/删除目标表的同一行。优化 ON 子句以确保目标行最多匹配一个源行,或使用 GROUP BY 子句对源行进行分组。

通过以下查询解决了问题:

UPDATE AA
   Set AA.ID5 = BB.ID5,
       AA.ID6 = BB.ID6,
       AA.ID7 = BB.ID7
From AA
Inner Join BB
    ON AA.ID4 = BB.ID4
      AND AA.ID1 = BB.ID1
      AND AA.ID2 = BB.ID2
      AND AA.ID3 = BB.ID3

感谢 Siggemannen 的建议解决了这个问题,感谢 Littlefoot 向我展示了 Merge 和每个人的意见。

Server SQL 更新 匹配

评论

0赞 jarlh 9/23/2023
您使用的是哪种 dbms?UPDATE FROM 是一种非标准语法。
0赞 GB1975 9/23/2023
我正在使用 SQL 2014 R2
0赞 jarlh 9/23/2023
您可能指的是MS SQL Server 2014。
0赞 siggemannen 9/23/2023
您的查询有什么问题?它应该适用于您的数据示例吗?
0赞 siggemannen 9/23/2023
如果您想加入其他 ID,那么您只需将其添加到您的加入中,例如AA.ID1 = BB.ID1 AND AA.ID2 = BB.ID2 AND AA.ID3 = BB.ID3 AND AA.ID4 = BB.ID4

答:

1赞 Littlefoot 9/23/2023 #1

对我来说,看起来是一个不错的选择。merge

样本数据;请注意,我修改了表中的第二行,因此不匹配:bbid4aa.id4

SQL> select * From aa;

       ID1        ID2        ID3        ID4        ID5        ID6        ID7
---------- ---------- ---------- ---------- ---------- ---------- ----------
        10         11         12         13          0          0          0
        20         21         22         23          0          0          0

SQL> select * From bb;

       ID1        ID2        ID3        ID4        ID5        ID6        ID7
---------- ---------- ---------- ---------- ---------- ---------- ----------
        10         11         12         13         14         15         16
        20         21         22         99         24         25         26
                                         ^^
                                        here    

合并:只会更新一行,因为只有一个匹配项:aa.id4 = bb.id4

SQL> merge into aa
  2    using bb
  3    on (aa.id4 = bb.id4)
  4    when matched then update set
  5      aa.id5 = bb.id5,
  6      aa.id6 = bb.id6,
  7      aa.id7 = bb.id7;

1 row merged.

结果:

SQL> select * From aa;

       ID1        ID2        ID3        ID4        ID5        ID6        ID7
---------- ---------- ---------- ---------- ---------- ---------- ----------
        10         11         12         13         14         15         16
        20         21         22         23          0          0          0

SQL>

评论

0赞 GB1975 9/23/2023
表 AA 有超过 200 万条记录,表 BB 有大约 190k 条记录。ID4 将是需要匹配的变量信息,以便从 BB 中提取所需的正确信息并将其放入 AA 中。
0赞 Littlefoot 9/23/2023
我不明白你在说什么。“ID4 会是可变信息吗”?什么?如果 ID4 在两个表中匹配,则该查询将完成其工作。
0赞 GB1975 9/23/2023
我没有正确解释它。ID1 到 ID4 在两个表中始终匹配。ID5 到 ID7 将是两个表中不同的信息。ID4 将从表 BB 中获取正确信息以放入表 AA 的关键。
0赞 Littlefoot 9/23/2023
如果我理解正确,这意味着 ON 子句应该扩展到 ID1、ID2 和 ID3(以及 ID4)。
0赞 GB1975 9/23/2023
我是查询设计的新手,所以可能做错了什么,但我收到:“MERGE 语句多次尝试更新或删除同一行。当目标行与多个源行匹配时,会发生这种情况。MERGE 语句不能多次更新/删除目标表的同一行。优化 ON 子句以确保目标行最多匹配一个源行,或使用 GROUP BY 子句对源行进行分组。您能举例说明该小组的样子吗?