Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 关于delete语句的ORA-00907_Oracle_Plsql_Ora 00907 - Fatal编程技术网

Oracle 关于delete语句的ORA-00907

Oracle 关于delete语句的ORA-00907,oracle,plsql,ora-00907,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

我试图从一个表中删除一条随机记录,但我得到了一个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)
);

也许是这样的?不是很优雅,但——就我所能测试的而言——似乎很有效。测试表是斯科特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
                                )
                  );

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);

删除子查询没有意义。ROWNUM=1只返回第一行,然后进行排序。您想做什么?您的内联ORDERBY子句导致了这种情况。