简体   繁体   English

Oracle SQL-使用WITH语句时无法更新

[英]Oracle SQL - Unable to Update when using WITH statement

I am trying to update a column based on virtual dataset created via a WITH statement. 我正在尝试根据通过WITH语句创建的虚拟数据集更新列。 I have simplified the statement as much as possible to get to the root issue. 我已经尽可能简化了声明,以解决根本问题。 It appears that UPDATE does not work when using a WITH statement, but I can't believe this is accurate. 似乎在使用WITH语句时UPDATE无法正常工作,但是我不敢相信这是正确的。 The error I am getting is 我得到的错误是

ORA-00928: missing SELECT keyword ORA-00928:缺少SELECT关键字

Here is my SQL statement. 这是我的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)

If I convert the 2nd portion of the statement to just a pure SELECT, it works... 如果我将语句的第二部分转换为纯SELECT,它将起作用...

with TEMP1 as (
      select  NN_NAME
      from SMB.ACCOUNTS
)   

(
    select TEMP1.NN_NAME 
    from TEMP1)

In Oracle, with does not go just at the beginning of a query. 在Oracle中, with并不仅仅出现在查询开始时。 It can go before any select . 它可以在任何select之前进行。 So: 所以:

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

I will suggest go for nested query that may solve your issue 我建议您进行嵌套查询,以解决您的问题

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

You could use a merge statement: 您可以使用合并语句:

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

or more simply: 或更简单地说:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM