具有子查询分解的 Oracle DELETE 语句

标签 oracle oracle10g ora-00928 subquery-factoring

尝试执行此操作(适用于 SQL Server):

WITH X AS (), Y AS (), Z AS ()
DELETE FROM TBL
WHERE TBL.ID IN (SELECT ID FROM Z);

这在 Oracle 中有效:

WITH X AS (), Y AS (), Z AS ()
SELECT * FROM TBL
WHERE TBL.ID IN (SELECT ID FROM Z);

但 DELETE 没有:ORA-00928:缺少 SELECT 关键字

我的子查询相当大,是否有不同的语法可以使其工作?

最佳答案

除了 SELECT 语句之外,您不能将子查询分解/CTE 与任何其他语句一起使用。 From the documentation:

You can specify this clause in any top-level SELECT statement and in most types of subqueries.

你可以这样做:

DELETE FROM tbl WHERE tbl.id IN
(WITH X AS (), Y AS (), Z AS ()
SELECT id FROM TBL
 WHERE TBL.ID IN (SELECT ID FROM Z));

关于具有子查询分解的 Oracle DELETE 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6603171/

相关文章:

sql - Oracle SQL : select from table with nested table

Java - 不带格式的输出数组

使用 JDBC 将记录插入数据库时​​出现 java.sql.SQLException : ORA-00928: missing SELECT keyword.

sql - SQL迁移数据时使用 "WITH AS"关键字

oracle - 如何使用jdbc从java类在TIMESTAMP列(Oracle)中插入当前时间

oracle - 如何显示Oracle嵌套游标循环的错误消息

oracle - 如何运行oracle企业管理器?

oracle - Golden Gate 复制极度延迟

sql - 如何从一个存储的proc中从SYS_REFCURSOR中获取数据,并在另一个过程中使用它?

oracle - Oracle中如何描述与动态SQL关联的引用游标?