【问题标题】:Update Oracle SQL Query throwing missing right parenthesis error更新 Oracle SQL 查询抛出缺少右括号错误
【发布时间】:2011-07-20 15:32:55
【问题描述】:
update mytable set node_index=0 where id in (
        SELECT 
            id
         FROM mytable
         WHERE 
            rownum<=10 and PROCS_DT is null  
         order by CRET_DT,PRTY desc) 

这是我遇到的错误

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

怎么了?请专家帮忙..我是Oracle 11g的新手

【问题讨论】:

    标签: sql oracle11g


    【解决方案1】:
    UPDATE  mytable
    SET     node_index = 0
    WHERE   rowid IN
            (
            SELECT  rid
            FROM    (
                    SELECT  rowid AS rid
                    FROM    mytable
                    WHERE   procs_dt IS NOT NULL
                    ORDER BY
                            cret_dt, prty
                    )
            WHERE   rownum <= 10
            )
    

    【讨论】:

    • 这行得通。感谢所有试图帮助我的人。这已被接受并为其他人 +1
    【解决方案2】:

    您不能在子查询中使用 order by 子句,如果您考虑一下,那么拥有它是没有意义的,因为您不需要影响更新的顺序。如果您通过查询删除订单应该可以工作,并且结果与允许订单的情况没有什么不同。

    【讨论】:

    • 我想更新具有最高优先级和最早创建日期的前 10 行,而不是查询选择的任何 10 行。我如何把它放在查询中
    • 看看 Quassnoi 的回答,看起来像你需要的。
    【解决方案3】:

    我相信您需要删除子查询中的ORDER BY。行的顺序对IN操作的逻辑结果没有意义。

    一般来说,当Oracle给出这个错误但你有平衡括号时,这意味着括号部分有意外的文本。

    根据评论进行编辑

    ROWNUM 在应用 ORDER BY 之前计算。为了做你想做的事,你需要一个嵌套的子查询,以便首先发生排序。

    update mytable set node_index=0 where id in (
        SELECT 
            id
         FROM
            ( SELECT id FROM mytable WHERE procs_dt IS NULL order by CRET_DT,PRTY desc)
         WHERE
            rownum<=10
        )
    

    在这种情况下,ORDER BY 是允许的,因为它确实会影响子查询的结果。

    【讨论】:

    • 我想更新优先级最高的前 10 个 id 的 node_index。我如何在查询中确保这一点
    • 谢谢。我也要试试这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 2015-04-16
    相关资源
    最近更新 更多