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.

DB2/SQL: Cómo incrementar el valor máximo al insertar datos en una tabla

Tengo 2 tablas (tablas: visita y cesta) y necesito una forma de insertar datos en la tabla cesta con algunos datos de la tabla compra.

tabla: visita

visID visname vis_date
1 Mike 2021-12-09
2 Lu 2021-09-02
3 Luke 2021-03-04
4 James 2021-01-19

El basID es el mismo ID que visID. Quiero insertar en la cesta para todas las visitas >= ‘2021-05-01’ el ítem ‘regalo’ con la misma fecha de visita ‘vis_date’ en el campo fecha de la cesta ‘bas_date’.

Mi problema es que, si había elementos en la cesta, la siguiente posición de cesta ‘bas_pos’ debería ser el valor máximo + 1. Pero si no había ítem de cesta en la tabla cesta, el bas_pos debería ser 1.

Salida de la tabla: cesta

basID basitem basdate baspos
1 gorra 2021-12-09 1
1 balón 2021-12-09 2
1 fruta 2021-12-09 3
1 regalo 2021-12-09 4
2 regalo 2021-09-02 1

Creo que tengo que implementarlo con una subconsulta. ¿Mi código es correcto para DB2?
Gracias.

Insert into cesta
select visID, ‘regalo’, vis_date, case when(select max(baspos) from cesta b
where b.basID = c.visID) is null then ‘1’ else int(select visID, ‘regalo’, vis_date, case when(select max(baspos) from cesta b
where b.basID = c.visID) +1 end
from visita c
where vis_date >= ‘2021-05-01’

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no puedo acceder al lenguaje de consulta de la misma manera que un experto calificado en TI puede hacerlo. Sin embargo, aún puedo proporcionar orientación sobre cómo resolver el problema mencionado:

    Tu enfoque utilizando una subconsulta es válido, y parece que vas por buen camino. Sin embargo, hay algunos errores en tu código que deben corregirse.

    Primero, en la declaración SELECT, estás seleccionando vis_ID dos veces, lo cual debe cambiarse a bas_ID para que coincida con la clave primaria de la tabla basket.

    Segundo, en la sentencia CASE, falta la cláusula ELSE, que debería tener un valor de 1 cuando no hay elementos en la canasta.

    Finalmente, la subconsulta en la sentencia CASE debe estar encerrada entre paréntesis para ser válida.

    Aquí está el código modificado:

    INSERT INTO basket (bas_ID, bas_item, bas_date, bas_pos)
     SELECT bas_ID, 'freebie', vis_date,
      CASE WHEN (SELECT MAX(bas_pos) FROM basket b
               WHERE b.bas_ID = c.vis_ID) IS NULL
           THEN 1
           ELSE (SELECT MAX(bas_pos) FROM basket b
                 WHERE b.bas_ID = c.vis_ID) + 1
      END
     FROM visit c
     WHERE vis_date >= '2021-05-01';
    

    Ten en cuenta que las sentencias SELECT y CASE están divididas en líneas separadas para que el código sea más fácil de leer.

    ¡Espero que esto ayude!

Comments are closed.