ORA-00907在删除声明中

时间:2018-04-18 23:46:56

标签: oracle plsql ora-00907

我正在尝试从表中删除一个随机记录,但是我得到一个 ORA-00907:错过右括号错误,我找不到错误。

这是我的陈述:

DELETE FROM participation WHERE ROWID IN (
    SELECT ROWID FROM participation
        WHERE ROWNUM = 1
        ORDER BY DBMS_RANDOM.RANDOM);

以下是表格:

CREATE TABLE participation (
    matrEmp     NUMBER(4)     NOT NULL,
    codeProj     VARCHAR(14)   NOT NULL,
    fonction VARCHAR2(255) NOT NULL,
    CONSTRAINT pk_part PRIMARY KEY (matrEmp, codeProj)
);

2 个答案:

答案 0 :(得分:1)

ROWNUM在您使用之前过滤数据,因此无法使用。对于旧版本,您可以选择随机的pk,

DELETE FROM participation s3
WHERE (s3.matrEmp, s3.codeProj) IN (SELECT s2.matrEmp,
                                         s2.codeProj
                                    FROM (SELECT RANK() over(ORDER BY DBMS_RANDOM.value) random_rank,
                                                 s1.matrEmp,
                                                 s1.codeProj
                                            FROM participation s1) s2
                                   WHERE random_rank = 1)

如果您使用Oracle 12c,则可以使用行限制

DELETE FROM participation s3
 WHERE (s3.matrEmp, s3.codeProj) IN (SELECT s1.matrEmp,
                                        s1.codeProj
                                   FROM participation s1
                                  ORDER BY DBMS_RANDOM.value 
                                  FETCH FIRST 1 ROWS ONLY);

答案 1 :(得分:0)

也许是这样的?不是很优雅,但是 - 据我测试它 - 似乎工作。 TEST表是Scott的EMP表的副本。

delete from test s
  where s.empno = (select r.empno 
                   from (select t.empno, row_number() over (order by t.empno) rn
                         from test t
                        ) r
                   where r.rn = (select round(dbms_random.value(1, m.cnt))
                                 from (select count(*) cnt 
                                       from test e
                                      ) m
                                )
                  );