我的 Oracle 联接更新语句有什么问题?

2023-11-23

我正在与一个Oracle10g 数据库。

我有以下两个表:

T_DEBTOR :
    - ID_DEBTOR
    - HEADER
T_ELEMENT :
    - ID_ELEMENT
    - ID_DEBTOR
    - INSURER

这两个表使用 ID_DEBTOR 字段连接。

仅当 HEADER 不为空时,我才想用关联的 T_DEBTOR.HEADER 更新 T_ELEMENT.INSURER 值。 换句话说:

If T_DEBTOR.HEADER != null
    Then T_ELEMENT.INSURER = T_DEBTOR.HEADER
    Else T_ELEMENT.INSURER is not modified!

我尝试使用以下 SQL 查询:

update
    T_ELEMENT elt
    set elt.INSURER = (
        select HEADER
            from T_DEBTOR debtor
            where
                debtor.HEADER is not null
                and debtor.ID_DEBTOR = elt.ID_DEBTOR);

此查询适用于链接到 HEADER 不为空的债务人的所有元素。 但是,当 T_DEBTOR.HEADER 为 null 时,此查询将 T_ELEMENT.INSURER 设置为 null,这是不正确的。

ie:

If T_DEBTOR.HEADER != null
    Then T_ELEMENT.INSURER = T_DEBTOR.HEADER   --> This part is OK
    Else T_ELEMENT.INSURER is set to null      --> This part is NOT OK

我的查询有什么问题?

编辑,关于布莱恩·斯托拉尔的回答:

我想做的是这样的:

update
    T_ELEMENT elt
    set elt.INSURER = (
        select HEADER
            from T_DEBTOR debtor
            where
                debtor.HEADER is not null
                and debtor.ID_DEBTOR = elt.ID_DEBTOR)
    where debtor.HEADER is not null;

好问题。

为了模拟您的情况,我创建了示例表:

SQL> create table t_debtor(id_debtor,header)
  2  as
  3  select 1, 'Header 1' from dual union all
  4  select 2, null from dual union all
  5  select 3, 'Header 3' from dual
  6  /

Tabel is aangemaakt.

SQL> create table t_element (id_element,id_debtor,insurer)
  2  as
  3  select 1, 1, 'to be updated' from dual union all
  4  select 2, 1, 'to be updated' from dual union all
  5  select 3, 2, 'not to be updated' from dual union all
  6  select 4, 2, 'not to be updated' from dual union all
  7  select 5, 3, 'to be updated' from dual
  8  /

Tabel is aangemaakt.

通过当前的更新语句,问题变得清晰:“不更新”值设置为 NULL:

SQL> update
  2      T_ELEMENT elt
  3      set elt.INSURER = (
  4          select HEADER
  5              from T_DEBTOR debtor
  6              where
  7                  debtor.HEADER is not null
  8                  and debtor.ID_DEBTOR = elt.ID_DEBTOR)
  9  /

5 rijen zijn bijgewerkt.

SQL> select * from t_element
  2  /

ID_ELEMENT  ID_DEBTOR INSURER
---------- ---------- -----------------
         1          1 Header 1
         2          1 Header 1
         3          2
         4          2
         5          3 Header 3

5 rijen zijn geselecteerd.

执行此更新的最佳方法是更新两个表的联接。但也有一些限制:

SQL> rollback
  2  /

Rollback is voltooid.

SQL> update ( select elt.insurer
  2                , dtr.header
  3             from t_element elt
  4                , t_debtor dtr
  5            where elt.id_debtor = dtr.id_debtor
  6              and dtr.header is not null
  7         )
  8     set insurer = header
  9  /
   set insurer = header
       *
FOUT in regel 8:
.ORA-01779: cannot modify a column which maps to a non key-preserved table

通过bypass ujvc提示,我们可以绕过这个限制。 但不建议这样做,除非您确实确定 t_debtor.id_debtor 是唯一的。

SQL> update /*+ bypass_ujvc */
  2         ( select elt.insurer
  3                , dtr.header
  4             from t_element elt
  5                , t_debtor dtr
  6            where elt.id_debtor = dtr.id_debtor
  7              and dtr.header is not null
  8         )
  9     set insurer = header
 10  /

3 rijen zijn bijgewerkt.

SQL> select * from t_element
  2  /

ID_ELEMENT  ID_DEBTOR INSURER
---------- ---------- -----------------
         1          1 Header 1
         2          1 Header 1
         3          2 not to be updated
         4          2 not to be updated
         5          3 Header 3

5 rijen zijn geselecteerd.

最好只添加一个主键。您可能已经准备好了这个:

SQL> rollback
  2  /

Rollback is voltooid.

SQL> alter table t_debtor add primary key (id_debtor)
  2  /

Tabel is gewijzigd.

SQL> update ( select elt.insurer
  2                , dtr.header
  3             from t_element elt
  4                , t_debtor dtr
  5            where elt.id_debtor = dtr.id_debtor
  6              and dtr.header is not null
  7         )
  8     set insurer = header
  9  /

3 rijen zijn bijgewerkt.

SQL> select * from t_element
  2  /

ID_ELEMENT  ID_DEBTOR INSURER
---------- ---------- -----------------
         1          1 Header 1
         2          1 Header 1
         3          2 not to be updated
         4          2 not to be updated
         5          3 Header 3

5 rijen zijn geselecteerd.

问候, 抢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的 Oracle 联接更新语句有什么问题? 的相关文章

随机推荐

  • 掩蔽者在 SHAP 包中真正做了什么并让他们适合训练或测试?

    我一直在努力与shap包裹 我想从我的逻辑回归模型中确定形状值 与此相反TreeExplainer the LinearExplainer需要一个所谓的掩蔽器 这个掩码器到底有什么作用 独立掩码器和分区掩码器有什么区别 另外 我对测试集中的
  • Windows中当前目录和工作目录的区别

    Windows 中的当前目录和工作目录有什么区别 如何更改 Notepad 或 Mozilla Firefox 等应用程序的工作目录 当前目录和工作目录只是同一事物的两个不同名称 每个进程维护一个当前目录 当前目录在启动时指定为用于创建进程
  • 正则表达式在尊重 CDATA 的同时转义 HTML 和符号

    我编写了一个内容管理系统 它使用服务器端正则表达式在页面响应发送到客户端浏览器之前对页面响应中的 符号进行转义 正则表达式会注意已转义的或属于 HTML 实体一部分的 符号 例如 以下内容 a b c amp d copy 2009 更改为
  • jQuery AJAX 调用弄乱了字符编码

    我有一个输出 JSON 的 servlet Servlet 的输出编码是 ISO 8859 1 我们的网络应用程序中的页面也设置为 ISO 8859 1 我会使用 UTF 8 但这超出了我的控制范围 我们必须使用 ISO 8859 1 当我
  • 了解 CPU 如何决定将哪些内容加载到高速缓存中

    假设一台计算机有 64k 的 L1 缓存和 512k 的 L2 缓存 程序员在主内存中创建 填充了一个包含 10mb 数据的数组 例如 3D 模型的顶点 索引数据 该数组可能包含一系列结构 例如 struct x vec3 pos vec3
  • 通过 Firebase 电子邮件/密码身份验证进行 CSRF 保护

    我正在努力将我的 Node js 应用程序部署到生产环境中 我们遇到了一些 CSRF 问题 但在深入研究问题并了解有关 CSRF 攻击的更多信息后 我想知道我们是否需要执行这些检查 我们的 API 已从 CSRF 检查中列入白名单 因此依赖
  • http://schemas.microsoft.com/winfx/2006/xaml/presentation 定义

    当您在 Visual Studio 中创建新的 WpfApplication 项目时 您将获得以下 XAML 复制并粘贴 URLhttp schemas microsoft com winfx 2006 xaml presentation在
  • 显示线框和纯色

    是否可以在同一对象上显示对象的线框及其面的纯色 我找到了一种使用对象克隆并分配不同材质的方法 例如 var geometry new THREE PlaneGeometry plane width plane height width 1
  • CSS 以百分比进行翻译会导致图像模糊

    我遇到过这个非常烦人的问题 当您将图像与变换对齐时 基于百分比进行平移会导致图像稍微模糊 这仅与百分比结盟 考虑这个CSS img display block height auto max width 100 transform tran
  • 提高 ASP.NET 应用程序的性能

    如何提高 ASP NET 应用程序的性能 我应该注意哪些领域 该应用程序包括数据库连接和图像解析等 编写高性能 Web 应用程序的 10 个技巧 提高 ASP net 应用程序性能的 20 个技巧 Bye
  • 已超过最大帧长度 65536

    我有一个设置 我使用 gremlin core 库来查询远程 Janusgraph 服务器 目前数据大小适中 但将来会增加 几天前 我在客户端上看到 已超出最大帧长度 65536 错误 我的服务器 yaml 文件中 maxContentLe
  • 低功耗蓝牙 GATT 安全级别

    我正在研究与 GATT 相关的低功耗蓝牙 BLE 中可用的安全类型 更具体地说 使用指定不同安全级别 低 中 高 的 gatttool 时会执行哪些操作 我的理解是 BLE 中的安全管理器支持 4 种不同的安全属性 没有配对 与不支持中间人
  • 如何使用 React 以编程方式填充输入字段值?

    我有一个带有一些输入字段的模式 我可以轻松地通过用户键入输入来自动传递数据 使用onChange输入字段中的函数 如
  • Python 中的双端队列是如何实现的,它们什么时候比列表更糟糕?

    我最近开始研究如何在 Python 中实现各种数据结构 以便使我的代码更加高效 在研究列表和双端队列的工作原理时 我发现当我想要移位和取消移位时 可以将时间从列表中的 O n 减少到双端队列中的 O 1 列表被实现为固定长度数组 这些数组具
  • 如何迭代 Pandas 中的多索引级别?

    我经常有 MultiIndex 索引 并且我想迭代较高级别索引相等的组 它基本上看起来像 from random import choice import pandas as pd N 100 df pd DataFrame choice
  • 为什么我的调用 API 或启动协程的函数返回空值或 null 值?

    免责声明 人们在通过 facebook firebase 等请求使用异步操作时询问数据为空 不正确时 会产生大量问题 我提出这个问题的目的是为每个人提供该问题的简单答案从android中的异步操作开始 我试图从我的一项操作中获取数据 当我使
  • 将键/值从一个字典复制到另一个字典中

    我有一个包含主要数据 大致 的字典 如下所示 UID A12B4 name John email email protected 我还有另一个字典 例如 UID A12B4 other thing cats 我不清楚如何 加入 这两个字典
  • 如何使用 React Router v6 创建子路由器?

    这是我当前的 React Router 实现 const router createBrowserRouter path element
  • HTML:我可以将下标文本放在上标的正下方吗?

    我有一个单词 它既有上标又有下标 现在我把它渲染成这样word
  • 我的 Oracle 联接更新语句有什么问题?

    我正在与一个Oracle10g 数据库 我有以下两个表 T DEBTOR ID DEBTOR HEADER T ELEMENT ID ELEMENT ID DEBTOR INSURER 这两个表使用 ID DEBTOR 字段连接 仅当 HE