MySQL – consulta de actualización basada en SELECT Query

Necesito verificar (de la misma tabla) si hay una asociación entre dos eventos en función de la fecha y la hora.

Un conjunto de datos contendrá la fecha de finalización de ciertos eventos y el otro conjunto de datos contendrá la fecha de inicio de otros eventos.

Si el primer evento se completa antes del segundo evento, me gustaría vincularlos.

Lo que tengo hasta ahora es:

SELECT name as name_A, date-time as end_DTS, id as id_A FROM tableA WHERE criteria = 1 SELECT name as name_B, date-time as start_DTS, id as id_B FROM tableA WHERE criteria = 2 

Entonces me uno a ellos:

 SELECT name_A, name_B, id_A, id_B, if(start_DTS > end_DTS,'VALID','') as validation_check FROM tableA LEFT JOIN tableB ON name_A = name_B 

¿Puedo entonces, basado en mi campo validation_check, ejecutar una consulta UPDATE con SELECT nested?

En realidad, puede hacer esto de dos maneras:

Sintaxis de unión de actualización de MySQL:

 update tableA a left join tableB b on a.name_a = b.name_b set validation_check = if(start_dts > end_dts, 'VALID', '') -- where clause can go here 

Sintaxis ANSI SQL:

 update tableA set validation_check = (SELECT if(start_DTS > end_DTS,'VALID','') as validation_check FROM tableA LEFT JOIN tableB ON name_A = name_B WHERE id_A = tableA.id_A) 

Escoja el que le parezca más natural.

 UPDATE `table1` AS `dest`, ( SELECT * FROM `table2` WHERE `id` = x ) AS `src` SET `dest`.`col1` = `src`.`col1` WHERE `dest`.`id` = x ; 

Espero que esto funcione para usted.

Fácil en MySQL:

 UPDATE users AS U1, users AS U2 SET U1.name_one = U2.name_colX WHERE U2.user_id = U1.user_id 

Si alguien intenta actualizar los datos de una base de datos a otra, independientemente de la tabla a la que se dirijan, debe haber algunos criterios para hacerlo.

Este es mejor y limpio para todos los niveles:

 update dbname1.content targetTable left join dbname2.someothertable sourceTable on targetTable.compare_field= sourceTable.compare_field set targetTable.col1 = sourceTable.cola ,targetTable.col2 = sourceTable.colb ,targetTable.col3 = sourceTable.colc ,targetTable.col4 = sourceTable.cold 

Traaa! ¡Funciona genial!

Con el entendimiento anterior, puede modificar los campos establecidos y los criterios “activados” para hacer su trabajo. También puede realizar comprobaciones, luego extraer los datos en la (s) tabla (s) temporal (es) y luego ejecutar la actualización usando la syntax anterior reemplazando los nombres de la tabla y columna.

Espero que funcione, si no me dejas saber. Escribiré una consulta exacta para ti.

Encontré esta pregunta al buscar mi propia solución para una unión muy compleja. Esta es una solución alternativa, a una versión más compleja del problema, que pensé que podría ser útil.

Necesitaba llenar el campo product_id en la tabla de actividades, donde las actividades están numeradas en una unidad, y las unidades están numeradas en un nivel (identificado con una cadena ?? N), de modo que uno puede identificar actividades usando un SKU, es decir, L1U1A1. Esas SKU se almacenan en una tabla diferente.

Identifiqué lo siguiente para obtener una lista de activity_id vs product_id: –

 SELECT a.activity_id, w.product_id FROM activities a JOIN units USING(unit_id) JOIN product_types USING(product_type_id) JOIN web_products w ON sku=CONCAT('L',SUBSTR(product_type_code,3), 'U',unit_index, 'A',activity_index) 

Descubrí que era demasiado complejo para incorporarlo a un SELECT en mysql, así que creé una tabla temporal y me uní a eso con la statement de actualización: –

 CREATE TEMPORARY TABLE activity_product_ids AS (); UPDATE activities a JOIN activity_product_ids b ON a.activity_id=b.activity_id SET a.product_id=b.product_id; 

Espero que alguien encuentre esto útil

  UPDATE receipt_invoices dest, (SELECT `receipt_id`, CAST((net * 100) / 112 AS DECIMAL (11, 2)) witoutvat FROM receipt WHERE CAST((net * 100) / 112 AS DECIMAL (11, 2)) != total AND vat_percentage = 12) src SET dest.price = src.witoutvat, dest.amount = src.witoutvat WHERE col_tobefixed = 1 AND dest.`receipt_id` = src.receipt_id ; 

Espero que esto te ayude en un caso en el que tienes que unir y actualizar entre dos tablas.

Puede actualizar valores de otra tabla usando una combinación interna como esta

 UPDATE [table1_name] AS t1 INNER JOIN [table2_name] AS t2 ON t1.column1_name] = t2.[column1_name] SET t1.[column2_name] = t2.column2_name]; 

Siga aquí para saber cómo usar esta consulta http://www.voidtricks.com/mysql-inner-join-update/

o puede usar seleccionar como subconsulta para hacer esto

 UPDATE [table_name] SET [column_name] = (SELECT [column_name] FROM [table_name] WHERE [column_name] = [value]) WHERE [column_name] = [value]; 

consulta explicada en detalles aquí http://www.voidtricks.com/mysql-update-from-select/

 UPDATE [table_name] AS T1, (SELECT [column_name] FROM [table_name] WHERE [column_name] = [value]) AS T2 SET T1.[column_name]=T2.[column_name] + 1 WHERE T1.[column_name] = [value]; 

Puedes usar:

 UPDATE Station AS st1, StationOld AS st2 SET st1.already_used = 1 WHERE st1.code = st2.code 

Para la misma mesa,

 UPDATE PHA_BILL_SEGMENT AS PHA, (SELECT BILL_ID, COUNT(REGISTRATION_NUMBER) AS REG FROM PHA_BILL_SEGMENT GROUP BY REGISTRATION_NUMBER, BILL_DATE, BILL_AMOUNT HAVING REG > 1) T SET PHA.BILL_DATE = PHA.BILL_DATE + 2 WHERE PHA.BILL_ID = T.BILL_ID; 

Tuve un problema con las entradas duplicadas en una misma tabla. Debajo están los enfoques que estaban funcionando para mí. También ha sido defendido por @sibaz.

Finalmente lo resolví usando las siguientes consultas:

  1. La consulta de selección se guarda en una tabla temporal

     IF OBJECT_ID(N'tempdb..#New_format_donor_temp', N'U') IS NOT NULL DROP TABLE #New_format_donor_temp; select * into #New_format_donor_temp from DONOR_EMPLOYMENTS where DONOR_ID IN ( 1, 2 ) -- Test New_format_donor_temp -- SELECT * -- FROM #New_format_donor_temp; 
  2. La tabla temporal se une en la consulta de actualización.

     UPDATE de SET STATUS_CD=de_new.STATUS_CD, STATUS_REASON_CD=de_new.STATUS_REASON_CD, TYPE_CD=de_new.TYPE_CD FROM DONOR_EMPLOYMENTS AS de INNER JOIN #New_format_donor_temp AS de_new ON de_new.EMP_NO = de.EMP_NO WHERE de.DONOR_ID IN ( 3, 4 ) 

No tengo mucha experiencia con SQL, por favor asesórate sobre cualquier mejor enfoque que conozcas.

Las consultas anteriores son para el servidor MySql.