Обновление Oracle Query не работает - PullRequest
0 голосов
/ 30 августа 2011

У меня есть запрос 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 являются изменениями. Пожалуйста, помогите мне в этом. Обновление не правильно. Пожалуйста, помогите мне в этом

Ответы [ 3 ]

5 голосов
/ 30 августа 2011

Вы указали таблицу 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)); 

Возможно, вы могли бы просто обновить таблицу emp без необходимости подзапроса, хотя, если вы ссылаетесь на таблицу данных в предложении where ...

3 голосов
/ 30 августа 2011

Попробуйте:

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);
3 голосов
/ 30 августа 2011

Ваш оператор обновления обновит все записи в таблице 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)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...