更新 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
客户端运行gpupdate /force,后提示原因是缺少到域控制器的网络连接
App Store 连接,缺少 App Store 服务器通知 URL 的输入