【问题标题】:Oracle SQL - Unable to Update when using WITH statementOracle SQL - 使用 WITH 语句时无法更新
【发布时间】:2016-10-26 11:31:19
【问题描述】:

我正在尝试根据通过 WITH 语句创建的虚拟数据集更新列。我已经尽可能简化了陈述以解决根本问题。使用 WITH 语句时,UPDATE 似乎不起作用,但我不敢相信这是准确的。我得到的错误是

ORA-00928:缺少 SELECT 关键字

这是我的 SQL 语句。

with TEMP1 as (
   select  NN_NAME
   from SMB.ACCOUNTS
)   

update SALES_PLAY_MATRIX_WORKING
set FY16_FOCUS = 'Y' where NN_NAME in ( select TEMP1.NN_NAME from TEMP1)

如果我将语句的第二部分转换为纯 SELECT,它可以工作...

with TEMP1 as (
      select  NN_NAME
      from SMB.ACCOUNTS
)   

(
    select TEMP1.NN_NAME 
    from TEMP1)

【问题讨论】:

    标签: sql oracle common-table-expression


    【解决方案1】:

    在 Oracle 中,with 不仅仅位于查询的开头。它可以在任何select 之前。所以:

    update SALES_PLAY_MATRIX_WORKING
        set FY16_FOCUS = 'Y'
        where NN_NAME in (
            with TEMP1 as (
                  select NN_NAME
                  from SMB.ACCOUNTS
                 )
            select TEMP1.NN_NAME 
            from TEMP1
           );
    

    【讨论】:

    • 甚至 ANSI SQL 兼容。 (功能 T121,“查询表达式中的 WITH(不包括 RECURSIVE)”。)
    【解决方案2】:

    我会建议使用可以解决您问题的嵌套查询

    UPDATE SALES_PLAY_MATRIX_WORKING
    SET FY16_FOCUS = 'Y' 
    WHERE NN_NAME IN ( SELECT NN_NAME FROM SMB.ACCOUNTS)
    

    【讨论】:

      【解决方案3】:

      您可以使用合并语句:

      MERGE INTO SALES_PLAY_MATRIX_WORKING dst
      USING ( SELECT NN_NAME FROM SMB.ACCOUNTS ) src
      ON    ( dst.NN_NAME = src.NN_NAME )
      WHEN MATCHED THEN
        UPDATE SET FY16_FOCUS = 'Y';
      

      或更简单地说:

      MERGE INTO SALES_PLAY_MATRIX_WORKING dst
      USING SMB.ACCOUNTS src
      ON    ( dst.NN_NAME = src.NN_NAME )
      WHEN MATCHED THEN
        UPDATE SET FY16_FOCUS = 'Y';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多