【问题标题】:Update inner join result Oracle更新内连接结果 Oracle
【发布时间】:2019-06-24 01:58:47
【问题描述】:

在我的 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,我正在使用内部连接并尝试实现与上述相同的输出

我正在使用内部连接并根据公共字段获取新的结果集。我想更新结果集但我无法弄清楚如何?

我有两个表“A”和“B”。

表“A”有列 id,name,statusA

表“B”有列 id,city,statusB

如开头所述,我使用的是内部连接,我的查询看起来像这样。

 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)  

样本数据

提出解决方案。

【问题讨论】:

  • 我认为样本数据和期望的结果会很有帮助。
  • 你试过UPDATE ( Select A.id A.statusA,B.statusB FROM A INNER JOIN ON B where A.id=B.id ) SET statusA = statusB 吗?如果满足某些条件,那么类似的东西就会起作用。
  • @GordonLinoff 示例数据已更新。

标签: sql oracle join oracle11g inner-join


【解决方案1】:

你想要这样的东西吗?

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

【讨论】:

    【解决方案2】:

    如果我理解正确,Oracle MERGE 查询可以正确响应您的需求:

    考虑:

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

    此查询将根据表B 中相应记录的状态更新表A 中的状态。

    Oracle 合并是针对多行 upsert(插入/更新)优化的供应商特定语句。

    Demo on DB Fiddle:

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

    身份证 |状态 | STATUSB
    -: | :-------- | :-------- 1 |待定 |发起 2 |待定 |完全的
     MERGE INTO A
     USING B ON (A.id = B.id)
     WHEN MATCHED THEN UPDATE SET A.statusA =  B.statusB
    

    2 行受影响
     Select A.id, A.statusA, B.statusB FROM A INNER JOIN B ON A.id=B.id
    

    身份证 |状态 | STATUSB
    -: | :-------- | :-------- 1 |发起 |发起 2 |已完成 |完全的

    如果您想将 statusA 设置为固定值,则可以:

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

    【讨论】:

    • 感谢您的建议。但我不想对 STATUSB 列进行任何更新。我只想更新 STATUSA 列
    • @hemantmali :此查询从状态B 更新状态A。它不更新状态 B.您要将 statusA 设置为哪个值?
    • 我想设置 statusA=“Finished” 以便 TableA 的所有行都更新。并使用 statusB vaule 在我的 java 对象中设置
    • @hemantmali :我用查询更新了我的答案,将 statusA 设置为“Finished”。 Java 部分对我来说似乎是一个不同的要求(这不是原始帖子的一部分,您可能想为此提出另一个问题,同时显示您现有的 Java 代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2017-08-28
    相关资源
    最近更新 更多