【问题标题】:Oracle update Query does not workOracle 更新查询不起作用
【发布时间】:2011-08-30 21:09:20
【问题描述】:

我有一个不适用于此查询的 ORACLE 查询。

UPDATE emp a set a.Enq_Status = 'PROGRESS' 
where exists (select * from emp  a, Data b   
         WHERE a.SA_Enq_Status is NULL 
           and a.EQ_Status = 'ACTIVATED' 
           and a.Activation_Return_Code = 0 
           and a.Alert_Code > 0 
           and a.User_Id = b.User_Id 
           and (b.Is_Associate is NULL or b.Is_Associate = 0)  
           and (b.Stk_Schd is NULL)
           and (b.Stk_Dis_Amt is NULL)
);

我的问题是我想将表 emp (A) 中的多条记录更新为状态为“PROGRESS”。但是在执行此查询时,a.Enq_status 中的所有记录都发生了变化。请帮助我。更新不正确.请在这方面帮助我

【问题讨论】:

  • 发生错误更新时a和b的值是多少?

标签: oracle oracle11g


【解决方案1】:

您在更新查询和子查询中都指定了表 emp,Oracle 会将它们视为单独的表。 您需要一个相关的子查询:

UPDATE emp a
   set a.Enq_Status = 'PROGRESS'   
 where exists (select 'X'                   
                 from Data b                   
                WHERE a.SA_Enq_Status is NULL                    
                  and a.EQ_Status = 'ACTIVATED'                    
                  and a.Activation_Return_Code = 0                    
                  and a.Alert_Code > 0                    
                  and a.User_Id = b.User_Id                    
                  and (b.Is_Associate is NULL or b.Is_Associate = 0) 
                  and (b.Stk_Schd is NULL)
                  and (b.Stk_Dis_Amt is NULL)); 

如果您在 where 子句中链接到 Data 表,您可能只需要更新 emp 表而不需要子查询...

【讨论】:

  • @peter:你说的是对的。但我也试过了。更新有效。但是 emp a 中的所有行都已更新。要清楚地说明 emp a 中不匹配的所有行where exists 子句中的条件应该保持不变。但是它们会受到影响。
  • 我会拉出 a-only where 子句条件,所以它看起来像“其中 a.SA_End_Status 为空且 a.EQ_Status = 'ACTIVATED' 和 a.ActivationReturnCode = 0 和 a.Alert_Code > 0 并且存在(从 Data b 中选择“x”,其中 a.User_Id = b.User_Id... 应该不会影响结果,但会更干净。
  • @Jim,刚刚在一个新的答案中做到了这一点,它让 OP 正在尝试做什么变得更加清晰。
【解决方案2】:

您的更新语句将更新 emp 表中的所有记录,因为您没有指定要更新的记录。如果您的子查询至少返回一行,则所有 emp 记录将被更新。如果它不返回任何行,则不会更新任何记录。

像这样更改您的更新:

UPDATE emp SET Enq_Status = 'PROGRESS' 
WHERE id in 
(SELECT a.id 
 FROM emp  a, Data b  
 WHERE a.SA_Enq_Status is NULL and a.EQ_Status = 'ACTIVATED' 
   and a.Activation_Return_Code = 0 and a.Alert_Code > 0 
   and a.User_Id = b.User_Id and (b.Is_Associate is NULL or b.Is_Associate = 0)
   and (b.Stk_Schd is NULL)and (b.Stk_Dis_Amt is NULL)
);

【讨论】:

  • @peter:where id in(select)..为什么我们使用 id 字段...我没有这样的字段...告诉我它的用途,以便我能理解
  • 我假设你有一个 id 字段。这个想法是使用emp表的主键。在查询中更改,而不是 id,输入您的主键。
【解决方案3】:

试试:

UPDATE emp a
   SET a.enq_status = 'PROGRESS'
 WHERE a.sa_enq_status IS NULL
   AND a.eq_status = 'ACTIVATED'
   AND a.activation_return_code = 0
   AND a.alert_code > 0
   AND EXISTS
       (SELECT 'X'
          FROM data b
         WHERE a.user_id = b.user_id
           AND ( b.is_associate IS NULL OR b.is_associate = 0 )
           AND b.stk_schd IS NULL
           AND b.stk_dis_amt IS NULL);

【讨论】:

    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    相关资源
    最近更新 更多