es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Actualizar varias columnas basadas en otra tabla en DB2 V5R4M0

Estoy trabajando en una declaración de actualización para una tabla AS400 DB/2. Se deben actualizar varias filas utilizando datos de otra tabla con campos coincidentes. Nuestra versión del controlador es: 05.04.0000 OS/400 V5R4M0.

Estoy teniendo problemas para averiguar la sintaxis correcta a usar.

Aquí está la CTE básica que estoy utilizando para recopilar los datos correctos a usar:

with tablesql as
              (
                select *
                from TBL1CPY
              ),
     tableAS400 as 
              (
                select *
                from TBL1 
                where LDT = '20220104' AND US = 'ADMIN'
               ),
     tableSQLFrmJoin as
              (
                select s.* 
                from tablesql s, tableAS400 a
                where s.prj = a.prj AND s.PN = a.PN AND s.IN = a.IN
              )

Aquí hay algunas cosas diferentes que he intentado con la CTE:

1) update TBL1 t1
set (STS) = ( select STS from tableSQLFrmJoin ) t2
where t1.prj = t2.prj AND t1.PN = t2.PN AND t1.IN = t2.IN

esto genera el error: Origen del error: Comando IBMDA400, Mensaje de error: SQL0199: Palabra clave Update no esperada…

2) MERGE INTO TBL1 t1
USING
(select * from tableSQLFrmJoin) t2
on (t1.prj = t2.prj AND t1.PN = t2.PN AND t1.IN = t2.IN)
when matched then
update SET STS = ‘TST’;

esto genera el error: Origen del error: Comando IBMDA400, Mensaje de error: SQL0104: Token MERGE no esperado…

3) update tbl1 t1, tableSQLFrmJoin t2
set t1.STS = ‘tst’
where t1.prj = t2.prj AND t1.PN = t2.PN AND t1.IN = t2.IN

esto genera el error: Origen del error: Comando IBMDA400, Mensaje de error: SQL0199: Palabra clave Update no esperada…

El resultado debería ser actualizar las filas coincidentes en tbl1 con los datos de la CTE “tableSQLFrmJoin”.
Por ahora, para hacer que la consulta funcione, solo estoy utilizando datos de prueba para los casos de configuración.

Usar una consulta simple,

Select * from tableSQLFrmJoin

funciona como se espera. Por lo tanto, la CTE tal como está escrita es compatible y funciona correctamente cuando se utiliza una declaración select.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basándome en los mensajes de error que compartiste, parece que la versión de DB2 en tu AS400 puede no admitir las declaraciones UPDATE o MERGE que estás intentando utilizar. Una posible solución sería utilizar una subconsulta correlacionada para actualizar las filas en tbl1 con datos de la CTE. Aquí tienes un ejemplo de cómo podría ser:

    update TBL1 t1
    set STS = (select STS from tableSQLFrmJoin t2 where t1.prj = t2.prj and t1.PN = t2.PN and t1.IN = t2.IN)
    where exists (select 1 from tableSQLFrmJoin t2 where t1.prj = t2.prj and t1.PN = t2.PN and t1.IN = t2.IN);
    

    En esta sintaxis, la subconsulta selecciona el valor de STS de la CTE donde los campos coincidentes en tbl1 y la CTE son iguales. La consulta externa luego actualiza la columna STS en tbl1 con el valor devuelto por la subconsulta, pero solo para las filas donde hay una coincidencia en la CTE (verificado mediante el predicado EXISTS). Puedes modificar esta consulta para incluir columnas adicionales de la CTE y actualizar otras columnas en tbl1 según sea necesario.

Comments are closed.