更新 ORA-00971 时左连接:缺少 SET 关键字 SQL [重复]

Posted

技术标签:

【中文标题】更新 ORA-00971 时左连接:缺少 SET 关键字 SQL [重复]【英文标题】:Left Join On Update ORA-00971: missing SET keyword SQL [duplicate] 【发布时间】:2019-09-11 03:14:59 【问题描述】:

在尝试运行这个简单的 UPDATE 语句时,我遇到了一个令人困惑的 ORA97100 missing SET keyword 错误。

UPDATE 
    WFINANCE.RKAP_PROYEKSI a
LEFT JOIN 
    WFINANCE.RKAP_MASTER_KODE b ON b.ID_KODE = a.KODE_ANGGARAN
SET 
    a.STATUS = 'Waiting Approval',
    a.T_ID = 'TR1234'
WHERE 
    a.TAHUN = '2018'
AND
    b.KET_KD_GAS = 'BJU'

我也尝试使用“AS”,但仍然出错。

任何深思熟虑的建议将不胜感激。

谢谢

【问题讨论】:

这是一个常见问题解答。在考虑发布之前,请始终使用谷歌搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,有或没有您的特定字符串/名称,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。除此之外,它不是最小的。)在这里,您可以截断代码,直到您得到一些有用的东西。但是,当您使用新的或不熟悉的语法时,请务必阅读包括语法和示例在内的手册。这是“研究”的一部分。 【参考方案1】:

首先 - 将 RKAP_MASTER_KODE 的连接设为外连接没有意义。 WHERE 子句中b.KET_KD_GAS = 'BJU' 的存在将其变为内部连接,因为查询不能接受没有b.KET_KD_GAS = 'BJU' 的行,因此需要RKAP_MASTER_KODE 中的行存在。如果您真的希望连接是可选的,那么将 b.KET_KD_GAS 谓词移动到连接子句中 - 但如果您这样做,那么加入 RKAP_MASTER_KODE 有什么意义,因为您使用它来选择性地限制结果,这并不是真正的“限制”。

不过,除此之外,Oracle 不允许在 UPDATE 语句中进行连接。解决方法是使用子 SELECT 将更新限制为适当的行:

UPDATE WFINANCE.RKAP_PROYEKSI a
  SET a.STATUS = 'Waiting Approval',
      a.T_ID = 'TR1234'
  WHERE a.TAHUN = '2018' AND
        a.KODE_ANGGARAN IN (SELECT b.ID_KODE
                              FROM WFINANCE.RKAP_MASTER_KODE b
                              WHERE b.KET_KD_GAS = 'BJU')

如果您真的不在乎 RKAP_MASTER_KODE 中是否有匹配的行,只需删除 UPDATE 的那部分:

UPDATE WFINANCE.RKAP_PROYEKSI a
  SET a.STATUS = 'Waiting Approval',
      a.T_ID = 'TR1234'
  WHERE a.TAHUN = '2018'

【讨论】:

【参考方案2】:

改用这个。

UPDATE 
    (SELECT a.STATUS , a.T_ID 
      FROM WFINANCE.RKAP_PROYEKSI a
      LEFT JOIN WFINANCE.RKAP_MASTER_KODE b ON b.ID_KODE = a.KODE_ANGGARAN
      WHERE 
        a.TAHUN = '2018' AND b.KET_KD_GAS = 'BJU') t1
SET 
    t1.STATUS = 'Waiting Approval',
    t1.T_ID = 'TR1234'

【讨论】:

以上是关于更新 ORA-00971 时左连接:缺少 SET 关键字 SQL [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle 更新语句中使用子查询而不是表名

使用cowplot将x轴切换到顶部时左对齐的轴标签

客户端运行gpupdate /force,后提示原因是缺少到域控制器的网络连接

App Store 连接,缺少 App Store 服务器通知 URL 的输入

连接字符串中缺少 MultipleActiveResultSets 导致错误

645. Set Mismatch 数组缺少的数字