【问题标题】:ORA-00907 On a delete statementORA-00907 在删除语句上
【发布时间】:2018-09-29 08:09:15
【问题描述】:

我正在尝试从表中删除一条随机记录,但我收到 ORA-00907: missing right parenthesis 错误并且我找不到问题所在。

这是我的声明:

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

【问题讨论】:

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

标签: oracle plsql ora-00907


【解决方案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);

【讨论】:

    【解决方案2】:

    也许是这样的?不是很优雅,但是 - 据我测试它 - 似乎正在工作。 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
                                    )
                      );
    

    【讨论】:

      猜你喜欢
      • 2015-05-29
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多