【问题标题】:Oracle DELETE statement with subquery factoring带有子查询分解的 Oracle DELETE 语句
【发布时间】:2011-07-06 21:22:18
【问题描述】:

尝试这样做(在 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 关键字

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

【问题讨论】:

    标签: oracle oracle10g ora-00928 subquery-factoring


    【解决方案1】:

    您不能将子查询分解/CTE 与 SELECT 语句一起使用。 From the documentation:

    您可以在任何 顶级 SELECT 语句和大多数 子查询的类型。

    你可以这样做:

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

    【讨论】:

      【解决方案2】:

      我得到了这个工作(我确定它在 SQL Server 中不起作用):

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

      【讨论】:

        【解决方案3】:

        嗯,至少,您需要让所有别名查询以某种方式出现在 FROM 语句中。我不知道是否还有更多问题,但这是必须的(我相信 00928 是您不这样做时发生的错误)。

        【讨论】:

        • 是的,我注意到 Oracle 不会像 SQL Server 那样让您留下未使用的子查询。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多