我正在尝试从表中删除一个随机记录,但是我得到一个 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)
);
答案 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
)
);