SQL - DB2. Update dinámico

 
Vista:
sin imagen de perfil

DB2. Update dinámico

Publicado por David (3 intervenciones) el 15/09/2015 13:59:50
Hola, os explico lo que quiero hacer, a ver si alguien me puede echar una mano.

Tengo estas tres tablas en una base de datos DB2:

TIPO_CATEGORIA
- ID_TIPO_CATEGORIA
- NOMBRE

CATEGORIA
- ID_CATEGORIA
- TITULO
- ID_TIPO_CATEGORIA

PRESUPUESTO_CATEGORIA
- ID_PRESUPUESTO
- ID_CATEGORIA

En la tabla TIPO_CATEGORIA tengo el siguiente registro:
- ID_TIPO_CATEGORIA: 1 - NOMBRE: TIPO CATEGORIA1

En la tabla CATEGORIA tengo varias categorías asociadas al tipo de categoría 1:
- ID_CATEGORIA: 1 - TITULO: CATEGORIA1 - ID_TIPO_CATEGORIA: 1
- ID_CATEGORIA: 2 - TITULO: CATEGORIA2 - ID_TIPO_CATEGORIA: 1
- ID_CATEGORIA: 3 - TITULO: CATEGORIA3 - ID_TIPO_CATEGORIA: 1

En la tabla PRESUPUESTO_CATEGORIA existen varios presupuestos asociados a categorías con tipo de categoría 1:
- ID_PRESUPUESTO: 1 - ID_CATEGORIA: 1
- ID_PRESUPUESTO: 2 - ID_CATEGORIA: 2
- ID_PRESUPUESTO: 3 - ID_CATEGORIA: 1
- ID_PRESUPUESTO: 4 - ID_CATEGORIA: 3

El tema es que tengo que crear un nuevo tipo de categoría:
- ID_TIPO_CATEGORIA: 2 - NOMBRE: TIPO CATEGORIA2

Además tengo que crear para este nuevo tipo de categoría (TIPO CATEGORIA2), las mismas categorías que existen en la tabla de CATEGORIAS para el tipo de categoría 1.
- ID_CATEGORIA: 4 - TITULO: CATEGORIA1 - ID_TIPO_CATEGORIA: 2
- ID_CATEGORIA: 5 - TITULO: CATEGORIA2 - ID_TIPO_CATEGORIA: 2
- ID_CATEGORIA: 6 - TITULO: CATEGORIA3 - ID_TIPO_CATEGORIA: 2

Hasta aquí todo correcto. Pues bien, a ver si me explico... Ahora lo que quiero es hacer un UPDATE sobre la tabla PRESUPUESTO_CATEGORIA, para que aquellos presupuestos cuya categoría relacionada es de tipo categoria 1, se asocien ahora a las categorías con tipo de categoria 2, que tengan el mismo nombre (campo TITULO) que las categorías con tipo de categoría 1 con las que están relacionados esos presupuestos originalmente. Es decir, atendiendo al ejemplo de datos expuesto anteriormente, la tabla PRESUPUESTO_CATEGORIA debería quedar así:
- ID_PRESUPUESTO: 1 - ID_CATEGORIA: 4
- ID_PRESUPUESTO: 2 - ID_CATEGORIA: 5
- ID_PRESUPUESTO: 3 - ID_CATEGORIA: 4
- ID_PRESUPUESTO: 4 - ID_CATEGORIA: 6

Como podéis ver se ha modificado la relación y aquellos presupuestos que tenían asociadas las categorías con tipo de categoría 1, CATEGORIA1, CATEGORIA2 Y CATEGORÍA3, ahora tienen asociadas las categorías con tipo de categoría 2, con el mismo nombre (TITULO).

Entiendo que habrá alguna manera de hacer el update en una sola sentencia para modificar esta relación, pero por más que llevo pegándome durante toda la mañana no soy capaz de dar con ella. Por favor, ¿alguien podría ayudarme?

Muchas gracias por molestaros en leerlo y un saludo.
David
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 109
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

DB2. Update dinámico

Publicado por Rafael (111 intervenciones) el 15/09/2015 14:15:18
Como con manzanas...

Paso 1:
Obtener lo que queremos obtener...

Es decir por un lado sabemos lso nombres de las categorias son iguales pero de distinto tipo
asi pues aplica un query como este:
1
2
3
4
5
6
7
SELECT CAT_A.ID_CATEGORIA ANTIGUA
     , CAT_B.ID_CATEGORIA NUEVA
FROM   CATEGORIA CAT_A
     , CATEGORIA CAT_B
WHERE  CAT_A.TITULO = CAT_B.TITULO
AND    CAT_A.ID_TIPO_CATEGORIA = 1
AND    CAT_B.ID_TIPO_CATEGORIA = 2;

Con esto podemos ver tanto el valor de la vieja categoria como el de la nueva, hemos igualado los titulos pero hemos tomado distintos tipos de categoria.

Paso 2:
Hacer el UPDATE ...
1
2
3
4
5
6
7
8
9
10
UPDATE PRESUPUESTO CATEGORIA PC
   SET PC.ID_CATEGORIA = (
                            SELECT CAT_B.ID_CATEGORIA NUEVA
                            FROM   CATEGORIA CAT_A
                                 , CATEGORIA CAT_B
                            WHERE  CAT_A.TITULO = CAT_B.TITULO
                            AND    CAT_A.ID_TIPO_CATEGORIA = 1
                            AND    CAT_B.ID_TIPO_CATEGORIA = 2
                            AND    CAT_A.ID_CATEGORIA = PC.ID_CATEGORIA
                          );

Pruebas y nos cuentas???

Saludos
(un mas uno si te sirve la información no esta de mas)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

DB2. Update dinámico

Publicado por David (3 intervenciones) el 15/09/2015 15:29:33
Hola!! Muchas gracias por responder tan rápido!!.

Ya lo he probado. El caso es que tiene muy buena pinta y pensé que iba a funcionar, pero al ejecutar el update me da un error de integridad referencial: DB2 SQL Error: SQLCODE=-407, SQLSTATE=23502

... Y no entiendo por qué. Se supone que las categorías de los presupuestos de la tabla PRESUPUESTO_CATEGORIA tienen que estar en la tabla CATEGORIA. Y se supone que al hacer el UPDATE lo único que estamos haciendo es cambiar una categoría existente en la tabla CATEGORIA, por otra también existente. No sé por qué no me deja. Sólo hay dos foreign keys en la tabla PRESUPUESTO_CATEGORIA, una para el id del presupuesto con la tabla PRESUPUESTO y otra para el id de la categoria con la tabla CATEGORIA.

No veo cual es el problema... :(

Muchas gracias de nuevo!!

Un saludo.
David
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 109
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

DB2. Update dinámico

Publicado por Rafael (111 intervenciones) el 16/09/2015 08:53:01
A ver el tema es que algo te esta regresando NULOS

El error que reportas es que hay algo que no esta haciendo MATCH
Es decir seguramente hay una categoria "vieja" que no tiene correspondencia con una categoria "nueva" luego entonces el query devuelve NULL, al tratar de insertar al campo marca error por que tu campo no admite NULOS.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

DB2. Update dinámico

Publicado por David (3 intervenciones) el 18/09/2015 15:45:40
Hola de nuevo!!

En principio no se debería estar intentando insertar ningún NULL, porque todas las categorías antiguas casan con las nuevas, no hay ninguna que no tenga correspondencia. Lo que sí sucede es que varias de las categorías antiguas, aunque son categorías distintas, con id distinto, tienen el mismo nombre. Me explico. Por ejemplo, tengo:

Categorías antiguas tabla CATEGORIA
- ID_CATEGORIA: 10 - TITULO: CATEGORIAFULANITO
- ID_CATEGORÍA: 11 - TITULO: CATEGORIAFULANITO
- ID_CATEGORIA: 12 - TITULO: CATEGORIAFULANITO

Categoría nueva tabla CATEGORÍA
- ID_CATEGORIA: 20 - TITULO: CATEGORIAFULANITO

Todas estas categorías antiguas, casarían con la misma categoría nueva. No sé si esto puede suponer un problema y provocar el error de integridad.

Muchísimas gracias!!

Un saludo,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar