更新Oracle SQL查询丢失右括号错误

时间:2011-07-20 15:32:55

标签: sql oracle11g

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的新手

3 个答案:

答案 0 :(得分:10)

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 :(得分:4)

您不能在子查询中使用order by子句,如果您认为它没有任何意义,因为您不需要影响更新的顺序。如果您通过查询删除订单应该有效,并且结果与订单允许的结果没有区别。

答案 2 :(得分:2)

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

通常,当Oracle发出此错误但您有平衡的括号时,这意味着括号内的部分会出现意外的文本。

编辑以回复评论

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

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是允许的,因为它确实会影响子查询的结果。