在我的Java代码中,我有一个foreach循环,可以循环访问列表
foreach(MyObject obj:list){
String status = obj.getStatus();
String is = obj.getId();
// DB call
1. To update Status in Table A
jdbcobj.updtastatus(status,id);
2. Get status from table B
String tableBStatu= jdbcobj.getstatufromtableB(status,id):
obj.setStatus(tableBStatus):
}
为了避免在for循环中出现2 dB的调用,我使用内部连接并尝试实现与上述相同的输出
我正在使用inner-join并基于公共字段获取新的结果集。我想更新结果集,但我不知道怎么办?
我有两个表“ A”和“ B”。
表“ A”具有列ID,名称,状态A
表“ B”具有ID,city,statusB列
正如开头所述,我正在使用inner-join,而我的查询如下所示。
Select A.id A.statusA,B.statusB FROM A INNER JOIN ON B where A.id=B.id
Which gives me result as "id", status from table "A" and status from table "B".
现在我要使用内部联接结果,以更新表“ A”中的statusA列并设置值=“ DONE”
并且要在java对象中使用statusB列值。
String statusfromColumnB = get statusB col value
并像这样在我的java对象中设置
myObj.setStatus(statusfromColumnB)
样本数据
建议一个解决方案。
答案 0 :(得分:1)
如果我对您的理解正确,那么Oracle MERGE
查询可以正确响应您的需求:
考虑:
MERGE INTO A
USING B ON (A.id = B.id)
WHEN MATCHED THEN UPDATE SET A.statusA = B.statusB
此查询将从表A
中相应记录的状态更新表B
中的状态。
Oracle merge是特定于供应商的语句,已针对多行upsert(插入/更新)进行了优化。
Select A.id, A.statusA, B.statusB FROM A INNER JOIN B ON A.id=B.id
ID | STATUSA | STATUSB
-: | :------ | :-------- 1 | Pending | Initiated 2 | Pending | Completed
MERGE INTO A
USING B ON (A.id = B.id)
WHEN MATCHED THEN UPDATE SET A.statusA = B.statusB
2 rows affected
Select A.id, A.statusA, B.statusB FROM A INNER JOIN B ON A.id=B.id
ID | STATUSA | STATUSB
-: | :-------- | :-------- 1 | Initiated | Initiated 2 | Completed | Completed
如果您想将statusA设置为固定值,则可以:
MERGE INTO A
USING B ON (A.id = B.id)
WHEN MATCHED THEN UPDATE SET A.statusA = 'Finished'
答案 1 :(得分:0)
您想要这样的东西吗?
update a
set (status, somewhereelsecolumn) =
(select 'DONE', <whatever>
from b
where A.id = B.id
)
where exists (select 1 from b where a.id = b.id);