ora-00933 sql 命令未正确结束删除语句

问题描述 投票:0回答:1

出现以下错误:

ora-00933 sql 命令未正确结束”错误 Oracle DELETE with JOIN 和 WHERE SQL 语句。

我尝试根据 INNER JOIN 中的第一个条件和 WHERE 中的第二个条件有条件地从 Oracle DB 表 XEDOCS_LB 中删除记录,如下所示:

DELETE FROM XEDOCS_LB
INNER JOIN (SELECT ID 
            FROM XEFOLDERS_LB
            WHERE TRANS_TYPE = '80'
              AND TO_DATE(TRUNC(DATEOFUPDATE)) 
                    BETWEEN TO_DATE(SUBSTR('1220430',2,6),'YYMMDD') 
                        AND TO_DATE(SUBSTR('1231231',2,6),'YYMMDD')) XEFOLDERS 
        ON EFOLDERID = XEFOLDERS.ID
WHERE TO_DATE(TRUNC(DATEOFUPDATE)) <= TO_DATE(SUBSTR('1230518',2,6),'YYMMDD')
sql oracle sql-delete
1个回答
0
投票

这在 Oracle 中是无效语法。

delete from xedocs_lb a
where exists (select null 
              from xefolders_lb b
              where b.trans_type = '80'
                and to_date(trunc(b.dateofupdate)) 
                              between to_date(substr('1220430',2,6),'YYMMDD') 
                                  and to_date(substr('1231231',2,6),'YYMMDD')
                and b.efolderid = a.id
             )
  and to_date(trunc(dateofupdate)) <= to_date(substr('1230518',2,6),'YYMMDD');

另一方面,也许你可以通过以下方式让它变得更简单

  • 删除
    to_date
    调用
    dateofupdate
    if 其数据类型为
    DATE
    - 可能是,根据
    trunc
    以及稍后与日期值的比较
  • 删除
    to_date(substr(...))
    一段代码 - 你为什么要使用它,如果例如
    1231231
    是硬编码字符串,所以您要从中提取日期?使用
    date
    文字(或具有适当格式模型的
    to_date
    函数)

所以:

delete from xedocs_lb a
where exists (select null 
              from xefolders_lb b
              where b.trans_type = '80'
                and trunc(b.dateofupdate) between date '2022-04-30' and date '2023-12-31' 
                and b.efolderid = a.id
             )
  and trunc(dateofupdate) <= date '2023-05-18'; 
© www.soinside.com 2019 - 2024. All rights reserved.