AnswerBun.com

¿Cómo puedo actualizar una columna tomando datos de otra tabla mediante JOIN en varias columnas?

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

Resultado esperado

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 columnaid_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.

2 Answers

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

Add your own answers!

Related Questions

Como iterar un entero en python?

1  Asked on September 20, 2020 by kilex

   

419 Page Expired, laravel JS

1  Asked on September 14, 2020 by yeisson-pinilla

     

¿Cómo crear un método para modificar la contraseña en node.js?

1  Asked on September 12, 2020 by osleynin-mambell-ramos

   

Actualizar datos en SSIS

1  Asked on September 11, 2020 by guillermo-ricardo-spindola-bri

     

Falta enviar datos del input a phpmyadmin (PHP)

0  Asked on September 11, 2020 by hatori-hanso

   

¿Cómo valido si una cadena es vacía en Python?

1  Asked on September 10, 2020 by fedorqui-so-deja-de-daar

   

Envío SMS no se envía pero informa éxito en la operación

2  Asked on September 8, 2020 by briast

     

Configuracion del web.Config

1  Asked on September 5, 2020 by afar1793

         

Iniciar un fragment al pulsar una notificación

0  Asked on September 3, 2020 by lukaman

 

Eventos del ratón con Python

0  Asked on September 3, 2020 by hector-lacunza

 

Problemas con el dismiss();

1  Asked on September 2, 2020 by tony-ormaza

 

No me funciona el @media

1  Asked on August 29, 2020 by francisco

       

Array Angular – IONIC

1  Asked on August 25, 2020 by isg-lokimil

   

Ask a Question

Get help from others!

© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP