Обновить результат внутреннего соединения Oracle - PullRequest
0 голосов
/ 30 января 2019

В моем 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):
    }

Чтобы избежать вызовов в 2 дБ для цикла, я использую внутреннее соединение и пытаюсь добиться того же результата, что и выше

Я использую inner-join и получаю новый набор результатов на основе общего поля. Я хочу обновить набор результатов, но не могу понять, как?

У меня есть две таблицы «A» и «B».

Таблица «A» имеет столбцы id, имя, статусA

Таблица «B» имеет столбцы id, город, 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".

Теперь я хочу использовать результат внутреннего соединения, чтобы обновить столбец statusA из таблицы "A" и установить значение = "DONE"

И хочу использовать значение столбца statusB вjava-объект.

String statusfromColumnB = get statusB col value 

и установите в моем java-объекте вот так

      myObj.setStatus(statusfromColumnB)  

Пример данных

enter image description here

Предложить решение.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Если я правильно вас понимаю, запрос Oracle MERGE может правильно ответить на ваши запросы:

Рассмотрим:

MERGE INTO A
USING B ON (A.id = B.id)
WHEN MATCHED THEN UPDATE SET A.statusA =  B.statusB

Этот запрос обновит статус в таблице Aиз соответствующей записи в таблице B.

Слияние Oracle - это оператор, специфичный для поставщика, который оптимизирован для многострочных загрузок (вставок / обновлений).

Демонстрация на БД Fiddle :

 Select A.id, A.statusA, B.statusB FROM A INNER JOIN B ON A.id=B.id

 ID | STATUSA | STATUSB<br>
 -: | :------ | :--------
  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<br>
 -: | :-------- | :--------
  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'
0 голосов
/ 30 января 2019

Хочешь что-нибудь подобное?

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