db2 — Массовое обновление строк с помощью select в разных таблицах

#db2 #sql-scripts

#db2 #sql-скрипты

Вопрос:

Я хотел обновить столбец для нескольких строк на основе приведенного ниже условия — я хочу обновить столбец AUUSRTX файла abhipsha / AUDUSERF только для этих строк

 WHERE AUDUSERF.AUUSRTP <> 'USR' and AUDUSERF.AUUSRTP <> 'usr'  
 

и значение, которое необходимо обновить, должно поступать из usrprffil.uptext из usrprffil соответствующего идентификатора пользователя. Идентификаторы пользователей обеих таблиц следующие

 usrprffil.upuprf = auduserf.auusrid 
 

Может кто-нибудь, пожалуйста, помочь с правильным запросом для этого требования.

Я написал следующие 3 запроса, но получаю сообщение об ошибке: «Результат выбора более одной строки» для 1-го и 2-го запросов запрос 1 —

 update  abhipsha/auduserf
set AUUSRTX = (                
    SELECT usrprffil.uptext
    from usrprffil  inner join             
         abhipsha/auduserf                                            
    on upuprf =auusrid  WHERE AUDUSERF.AUUSRTP <> 'USR'            
    and auduserf.auusrtp <> 'usr'   and auusrid = usrprffil.upuprf)
 

запрос 2 —

 update abhipsha/auduserf set AUUSRTX =                             
   (SELECT uptext fROM usrprffil inner                               
     join abhipsha/auduserf 
    on usrprffil.UPUPRF = auduserf.AUUSRID 
     WHERE
       usrprffil.UPUPRF in (
          SELECT AUUSRID FROM abhipsha/auduserf
          WHERE   
          AUUSRTP <> 'USR' and AUUSRTP <> 'usr'
       ) 
   )
 

для 3-го запроса я получаю ошибку с нулевым значением
запрос 3 —

 update abhipsha/auduserf 
set  auduserf.AUUSRTX = (
    select UPTEXT      
    from usrprffil   
    WHERE usrprffil.UPUPRF = auduserf.AUUSRID 
    and   usrprffil.UPUPRF    in                                               
       (SELECT AUUSRID FROM abhipsha/auduserf                               
        WHERE AUUSRTP <> 'USR' and   AUUSRTP <> 'usr') 
    and uptext <> ' ' and 
    uptext is not null )   

                                         
 

Недопустимые значения Null в столбце или переменной AUUSRTX.

Комментарии:

1. Вы говорите «файл». Какая платформа и версия Db2?

Ответ №1:

Попробуйте это:

 update  abhipsha/auduserf a
set AUUSRTX =
COALESCE
(
  (                
    SELECT min(u.uptext)
    from usrprffil u
    WHERE a.auusrid = u.upuprf
  )
, AUUSRTX
)  
WHERE a.AUUSRTP NOT IN ('USR', 'usr')
 

Примечания:

  1. min Функция используется, чтобы не возвращать несколько строк из вложенного выбора.
  2. Если вложенный выбор не возвращает строк, значение AUUSRTX столбца остается неизменным.

Конечно, вы можете настроить приведенную выше логику в соответствии с вашими потребностями.