从表内连接中删除 - ORA-00933:SQL 命令未正确结束

Posted

技术标签:

【中文标题】从表内连接中删除 - ORA-00933:SQL 命令未正确结束【英文标题】:Delete from table inner join - ORA-00933: SQL command not properly ended 【发布时间】:2016-05-20 13:06:32 【问题描述】:

目的是仅当同一表中不存在相同记录时才将记录插入表中。 因此,我将该表的值存储在像这样的游标中:-

cursor note_data is
        select  note_s.nextval, i_user_book_id, i_course_user_id, book_edition_id, book_id, n.role_type_id, page_id, book_page_number, 
                        xcoord, ycoord, width, height, share_across_courses, sysdate, i_user_id, description, share_with_students,text
        from    note n, course_user cu
        where   n.course_user_id = cu.course_user_id
        and     cu.course_id = i_from_course_id;

现在,我将像这样使用内部联接从表中删除记录 -

delete n 
from note n 
inner join course_user cu 
on n.course_user_id = cu.course_user_id 
where cu.course_id = i_from_course_id;

执行此删除语句时,我收到错误 - 'ORA-00933:SQL 命令未正确结束'

如果我能够从表中删除记录,我将使用此代码将游标数据中的相同记录插入到同一个表中:-

FOR notecopy IN note_data LOOP
    insert into note (note_id, user_book_id, course_user_id, book_edition_id, book_id, role_type_id, page_id, book_page_number, 
                            xcoord, ycoord, width, height, share_across_courses, date_created, date_updated, created_by, updated_by, description, share_with_students,text)
    values (note_s.nextval, notecopy.i_user_book_id, notecopy.i_course_user_id, notecopy.book_edition_id, notecopy.book_id, notecopy.role_type_id, notecopy.page_id, notecopy.book_page_number, 
                            notecopy.xcoord, notecopy.ycoord, notecopy.width, notecopy.height, notecopy.share_across_courses, sysdate, sysdate, notecopy.i_user_id, notecopy.i_user_id, notecopy.description, notecopy.share_with_students, notecopy.text);
END LOOP; 

我的目标是仅当同一表中不存在相同记录时才将记录插入表中。

请指导如何处理删除语句错误,并建议我是否遵循正确的方法来实现目标。如果没有,请提出一些替代方法。

谢谢

【问题讨论】:

为什么不使用 MERGE 呢?如果您的数据库连接中断,它会更清洁、更安全。 正如@pyNoob 所说,您想为此使用 MERGE 语句。但至于您的问题,您不能加入 DELETE 声明。您可以将连接作为子查询放在 WHERE 子句中。还有为什么delete n from note n...?将其更改为delete from note n 【参考方案1】:
delete from note n 
inner join course_user cu 
on n.course_user_id = cu.course_user_id 
where cu.course_id = i_from_course_id;

它应该从注释 n 中删除。

使用 Merge 查看此处的链接。如果您对如何做有疑问,我会回答。 https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm

【讨论】:

【参考方案2】:

您需要将其表述为DELETE FROM (subquery)...,如

DELETE
  FROM (SELECT *
          FROM NOTE n
          INNER JOIN COURSE_USER cu
            ON n.COURSE_USER_ID = cu.COURSE_USER_ID
          WHERE cu.COURSE_ID = i_from_course_id)

对您的表、它们的列或它们的关系一无所知

话虽如此,使用 MERGE 更新或插入而不是删除所有数据然后重新插入的建议可能是有效的。

祝你好运。

【讨论】:

以上是关于从表内连接中删除 - ORA-00933:SQL 命令未正确结束的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00933: SQL 命令未正确结束 00933. 00000 - “SQL 命令未正确结束

SQL 错误:ORA-00933:SQL 命令未正确结束 00933。00000 -“SQL 命令未正确结束”

ORA-00933: SQL 命令未在存储过程中正确结束

ORA 00933 sql 命令未正确结束

ORA-00933: SQL 命令未正确结束

ora-00933: sql 命令未正确结束怎么解决