Stack Overflow en español Asked by A. Cedano on December 15, 2020
Estoy un poco bloqueado con esto, a ver si alguien me da una mano.
Por un lado tengo una tabla llamada liturgia_horas_lpatristicas
. En esa tabla tengo una columna llamada id_liturgia
con valores como este: 0708310401
. El objetivo es normalizar ese valor, que pensé en un principio como una especie de código combinado donde 07representa una cosa,
08otra cosa,
31` otra cosa y así.
Para ello creé en esa tabla una columna nueva sin datos que se llama id_breviario
.
Por otro lado creé una nueva tabla llamada liturgia_breviario
con las columnas: id_breviario, id_tiempo, id_ciclo, id_semana, id_dia
.
La normalización consiste en que tengo que actualizar la columna id_breviario
de liturgia_horas_lpatristicas
con el valor correspondiente en liturgia_breviario
.
Muestro un ejemplo de los datos:
En liturgia_horas_lpatristicas
tengo datos así:
id_patristica id_liturgia id_breviario
-----------------------------------------------
76589 0708310401 NULL
76590 0708310501 NULL
Y en liturgia_breviario
tengo filas así:
id_breviario id_tiempo id_ciclo id_semana id_dia
----------------------------------------------------------------------
1 7 8 31 4
2 7 8 31 5
3 7 8 31 6
id_patristica id_liturgia id_breviario
-----------------------------------------------
76589 0708310401 1
76590 0708310501 2
Son muchas filas, por lo que necesitaría un UPDATE
que funcione mediante JOIN, poniendo en cada fila el
id_brevisrioque corresponda. El criterio sería determinar los valores de join basándose en subtrings de la columna
id_liturgia`, algo así:
SUBSTRING(id_liturgia,1,2) t,
SUBSTRING(id_liturgia,3,2) c,
SUBSTRING(id_liturgia,5,2) s,
SUBSTRING(id_liturgia,7,2) d
Ahí yo tendría en t,c,s,d
los valores que podría usar como criterio para encontrar el id_breviario
en la tabla liturgia_breviario
, pero realmente no sé cómo armar la consulta para que me haga la actualización de cada fila.
El esquema de UPDATE basado en otra tabla que conozco ese este:
UPDATE liturgia_horas_lpatristicas t2,
(SELECT id_breviario FROM liturgia_breviario WHERE -- criterios de t1 ) t1
SET
t2. id_breviario = t1. id_breviario
WHERE -- criterios de t2;
Pero esto no hace un JOIN
dinámico para actualizar cada valor con su correspondiente.
Otra opción es la siguiente:
UPDATE
`liturgia_horas_lpatristicas`
INNER JOIN (
SELECT
`liturgia_breviario`.`id_breviario`,
GROUP_CONCAT(
LPAD(`liturgia_breviario`.`id_tiempo`, 2, 0),
LPAD(`liturgia_breviario`.`id_ciclo`, 2, 0),
LPAD(`liturgia_breviario`.`id_semana`, 2, 0),
LPAD(`liturgia_breviario`.`id_dia`, 2, 0)
) `grupo_liturgia_breviario`
FROM
`liturgia_breviario`
GROUP BY
`liturgia_breviario`.`id_breviario`
) `der`
SET
`liturgia_horas_lpatristicas`.`id_breviario` = `der`.`id_breviario`
WHERE
LEFT(`liturgia_horas_lpatristicas`.`id_liturgia`, 8) = `der`.`grupo_liturgia_breviario`;
Ver dbfiddle.
Al no disponer de las estructuras reales de las tablas, inferí algunos tipos de datos de las columnas que seguramente no serán los de sus tablas.
Correct answer by wchiquito on December 15, 2020
La relación entre las dos tablas, entiendo, podría definirse así:
SELECT lhl.id_liturgia,
lb.id_breviario
FROM liturgia_horas_lpatristicas lhl
INNER JOIN liturgia_breviario lb
ON lb.id_tiempo = lhl.SUBSTRING(id_liturgia,1,2)
AND lb.id_ciclo = lhl.SUBSTRING(id_liturgia,3,2)
AND lb.id_semana = lhl.SUBSTRING(id_liturgia,5,2)
AND lb.id_dia = lhl.SUBSTRING(id_liturgia,7,2)
Con esta consulta podría "pivotear" en el update
UPDATE liturgia_horas_lpatristicas
SET id_breviario = T2.id_breviario
FROM liturgia_horas_lpatristicas T1
INNER JOIN (
SELECT lhl.id_liturgia,
lb.id_breviario
FROM liturgia_horas_lpatristicas lhl
INNER JOIN liturgia_breviario lb
ON lb.id_tiempo = lhl.SUBSTRING(id_liturgia,1,2)
AND lb.id_ciclo = lhl.SUBSTRING(id_liturgia,3,2)
AND lb.id_semana = lhl.SUBSTRING(id_liturgia,5,2)
AND lb.id_dia = lhl.SUBSTRING(id_liturgia,7,2)
) T2
ON T1.id_liturgia = T2.id_liturgia
Answered by Patricio Moracho on December 15, 2020
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP