提问人:GB1975 提问时间:9/23/2023 最后编辑:Dale KGB1975 更新时间:9/23/2023 访问量:71
使用表 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
问:
我需要使用表 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 和每个人的意见。
答:
1赞
Littlefoot
9/23/2023
#1
对我来说,看起来是一个不错的选择。merge
样本数据;请注意,我修改了表中的第二行,因此不匹配:bb
id4
aa.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 子句对源行进行分组。您能举例说明该小组的样子吗?
评论
AA.ID1 = BB.ID1 AND AA.ID2 = BB.ID2 AND AA.ID3 = BB.ID3 AND AA.ID4 = BB.ID4