首页 > 解决方案 > 更新时左连接 ORA-00971:缺少 SET 关键字 SQL

问题描述

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

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”,但仍然出错。

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

谢谢

标签: sqloraclejoinsql-update

解决方案


首先 - 将 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 语句中进行联接。解决方法是使用 sub-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'

推荐阅读