Oracle 关于delete语句的ORA-00907
我试图从一个表中删除一条随机记录,但我得到了一个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
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子句导致了这种情况。