更新内部联接结果Oracle

时间:2019-01-30 17:43:28

标签: sql oracle join oracle11g inner-join

在我的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)  

样本数据

enter image description here

建议一个解决方案。

2 个答案:

答案 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(插入/更新)进行了优化。

Demo on DB Fiddle

 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);