2013-08-02 7 views
0

enter image description hereОбновление значения столбца из другого столбца в одной и той же таблицы на основе другой строки

База данных: Oracle

Я хотел бы обновить значение столбца ClientCode «30» до «40» на основе следующего условия :

Если a.Newcode (12.1.1) = b.Old_code (12.1.1) и b.new_code является нулевым

Я попытался следующий запрос, но не успех до сих пор;

UPDATE CLIENTACTIVITYCODEMAPPING a 

SET a.CLIENTCODE = (SELECT B.CLIENTCODE FROM CLIENTACTIVITYCODEMAPPING b 

         WHERE b.NEW_CODE IS NULL 
          AND b.PROJECTCODE = A.PROJECTCODE 
           AND b.OLD_CODE = a.NEW_CODE) 
WHERE a.PROJECTCODE = 2242 

AND a.NEW_CODE IS NOT NULL 

AND A.NEW_CODE IN (SELECT c.OLD_CODE FROM CLIENTACTIVITYCODEMAPPING c where c.new_code is null and c.old_code = a.new_code) 
+0

Любая ошибка? Что не работает? – Marc

+0

Проверьте ошибку Constraint на столбце ClientCode. ClientCode не может быть NULL. Я думаю, что мой внутренний запрос не возвращает строку. – user1263981

+0

Я не понимаю утверждение if. это не b.new_code код вместо null? – Marc

ответ

0

Одним из решений является добавление коррелировала подзапрос в предложении where, а также:

UPDATE CLIENTACTIVITYCODEMAPPING a 
    SET a.CLIENTCODE = (SELECT B.CLIENTCODE 
         FROM CLIENTACTIVITYCODEMAPPING b 
         WHERE b.NEW_CODE IS NULL AND b.PROJECTCODE = A.PROJECTCODE AND 
           b.OLD_CODE = a.NEW_CODE 
         ) 
    WHERE a.PROJECTCODE = 2242 AND a.NEW_CODE IS NOT NULL and 
      A.NEW_CODE IN (SELECT c.OLD_CODE FROM CLIENTACTIVITYCODEMAPPING c where c.new_code is null and c.old_code = a.new_code) and 
      exists (SELECT B.CLIENTCODE 
        FROM CLIENTACTIVITYCODEMAPPING b 
        WHERE b.NEW_CODE IS NULL AND b.PROJECTCODE = A.PROJECTCODE AND 
         b.OLD_CODE = a.NEW_CODE 
       ) 

Другой способ заключается в использовании coalesce() сохранить такое же значение, когда новый будет NULL:

UPDATE CLIENTACTIVITYCODEMAPPING a 
    SET a.CLIENTCODE = coalesce((SELECT B.CLIENTCODE 
           FROM CLIENTACTIVITYCODEMAPPING b 
           WHERE b.NEW_CODE IS NULL AND b.PROJECTCODE = A.PROJECTCODE AND 
             b.OLD_CODE = a.NEW_CODE 
           ), a.clientcode) 
    WHERE a.PROJECTCODE = 2242 AND a.NEW_CODE IS NOT NULL and 
      A.NEW_CODE IN (SELECT c.OLD_CODE FROM CLIENTACTIVITYCODEMAPPING c where c.new_code is null and c.old_code = a.new_code) 
Смежные вопросы