【问题标题】:Oracle SQL "deep update"Oracle SQL“深度更新”
【发布时间】:2014-05-28 17:30:46
【问题描述】:

所以我不确定它叫什么,但我需要弄清楚如何最好地进行可能涉及插入、更新和删除操作的更新。情况如下:我的应用程序有存储在数据库中的 POJO。这些对象可能包括也存储在数据库中的其他对象的列表。例如,一个 Bag 对象可能有一个 Item 对象列表。

我希望能够更新包。但是,有 3 种可能的情况:

  1. 包中的所有物品都已在数据库中。在这种情况下,我只需要更新数据库中的项目。
  2. 包中有一些不在数据库中的项目。在这种情况下,我需要弄清楚哪些项目是新的,然后插入它们
  3. 我正在更新的 Bag 对象中不再存在数据库中的项目。在这种情况下,我需要从数据库中删除额外的项目。

这里明显的解决方案是删除它并重新插入所有内容。但这很慢,并且会导致生成新的密钥。在大多数情况下,这不是问题,但它可能会在未来造成重大问题。

根据我的研究,我发现 MERGE 可能很有用。但是,根据我的阅读,MERGE 更适合数据组。我很可能只想对单个条目进行更新,或者项目列表可能只包含一个对象。此外,看起来 MERGE 只能删除匹配的记录。

设计此功能的最佳方式是什么?

【问题讨论】:

    标签: sql oracle merge


    【解决方案1】:

    合并是一种方法。

    有一个包: 项目=项目1,项目2

    有一个 BagInDB: bag_id = 1 items=Item1,Item3

    所以我们需要更新Item1,添加Item2和删除Item3

    第一步(加入):

    select * from bag full outer join (select * from bagInDB where bag_id = 1)
    

    它会给你

    bag_itemName bagInDb_itemName
    ------------ ----------------
    Item1        Item1
    Item2        null
    null         Item3
    

    第二步(合并)

    merge into baginDB b
    using(query above) q on b.bag_id = 1 and b.itemName = q.bagInDb_itemName
    when matched then
    delete where q.bag_itemName is null
    <rest of the conditions>
    

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      相关资源
      最近更新 更多