使用 not in 语句 Oracle 更新查询

Posted

技术标签:

【中文标题】使用 not in 语句 Oracle 更新查询【英文标题】:Update query with not in statement Oracle 【发布时间】:2017-12-20 07:06:21 【问题描述】:

我正在运行一个带有 NOT IN 的更新语句,其中包含另一个返回一些签证号码的查询。

似乎也有一个我无法追踪的错误,我怀疑我是否可以在NOT IN 中使用查询。如果有人能指出我在这里做错了什么。

Error report -
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:





UPDATE HUDHAIFA.VISA_APP
    SET VISA_NO=(LPAD(TRIM(VISA_NO),8,'0'))
    WHERE LENGTH(VISA_NO) < 8
    AND VISA_NO IS NOT NULL
    AND VISA_NO NOT IN (  
      SELECT
      CASE
        WHEN LTRIM(VISA_NO, '0') IS NULL THEN VISA_NO
        WHEN LTRIM(VISA_NO, '0') IS NOT NULL THEN LTRIM(VISA_NO, '0') 
      END as VISA_NO
      FROM HUDHAIFA.VISA_APP
      WHERE LENGTH(VISA_NO) < 8
      GROUP BY CASE
        WHEN LTRIM(VISA_NO, '0') IS NULL THEN VISA_NO
        WHEN LTRIM(VISA_NO, '0') IS NOT NULL THEN LTRIM(VISA_NO, '0') 
      END
      HAVING COUNT(*) > 1
      ORDER BY VISA_NO asc
    );

【问题讨论】:

【参考方案1】:

请尝试删除ORDER BY VISA_NO asc 并运行。它在语法上不正确,在您的情况下不需要。

【讨论】:

【参考方案2】:

通常,ORA-907 通常不使用右括号,而是表示“这个地方附近有语法错误,所以我无法想象你想要什么,我猜你应该关闭之前在某处打开的左括号”。在您的情况下,正如 Bikash Ranjan Bhoi 所说,原因是 ORDER BY 子句对此类子查询毫无意义。

您还应该检查该子查询是否永远不会在其结果中产生NULLINNOT IN 语句都需要非空值集。

【讨论】:

以上是关于使用 not in 语句 Oracle 更新查询的主要内容,如果未能解决你的问题,请参考以下文章

oracle_not exists和not in的用法和区别

plsql查询语句中的not in啥意思

Oracle学习篇之SQL语句的优化

sql优化activiti基本数据类型包装数据类型拾遗

Oracle in与exists语句

Mysql查询in语句都走索引吗