una - update select mysql ejemplo
MySQL-ACTUALIZAR consulta basada en consulta SELECT (12)
Necesito verificar (de la misma tabla) si hay una asociación entre dos eventos basados en la fecha y la hora.
Un conjunto de datos contendrá la fecha y hora de finalización de ciertos eventos y el otro conjunto de datos contendrá la fecha y hora de inicio para 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
Entonces, ¿puedo, en función de mi campo validation_check, ejecutar una consulta de ACTUALIZACIÓN con el SELECT anidado?
Consulte con la siguiente consulta.
actualizar la tabla A Una tabla de unión interna B B en A.name_a = B.name_b establecer validation_check = if (start_dts> end_dts, ''VALID'', '''')
Encontré esta pregunta buscando 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 creo que podría ser útil.
Necesitaba rellenar el campo product_id en la tabla de actividades, donde las actividades se numeran en una unidad y las unidades se numeran en un nivel (identificado mediante una cadena ?? N), de manera que se pueden identificar actividades utilizando un SKU, es decir, L1U1A1. Esos 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 eso era demasiado complejo para incorporarlo en un SELECT dentro de mysql, así que creé una tabla temporal, y me uní a eso con la declaración de actualización:
CREATE TEMPORARY TABLE activity_product_ids AS (<the above select statement>);
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
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
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;
Puedes actualizar los 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/
Puedes hacer esto de dos maneras:
Sintaxis de unirse a la actualización de MySQL:
update tableA a
inner 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 de SQL ANSI:
update tableA set validation_check =
(SELECT if(start_DTS > end_DTS,''VALID'','''') as validation_check
FROM tableA
INNER JOIN tableB ON name_A = name_B
WHERE id_A = tableA.id_A)
Elige el que te parezca más natural.
Puedes usar:
UPDATE Station AS st1, StationOld AS st2
SET st1.already_used = 1
WHERE st1.code = st2.code
Si alguien está buscando actualizar los datos de una base de datos a otra sin importar a qué tabla se dirigen, 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 muy bien
Con la comprensión anterior, puede modificar los campos establecidos y los criterios "en" para hacer su trabajo. También puede realizar las comprobaciones, luego extraer los datos en la (s) tabla (s) temporal (es) y luego ejecutar la actualización usando la sintaxis anterior reemplazando sus nombres de tabla y columna.
Espero que funcione, si no me avisas. Voy a escribir una consulta exacta para usted.
Tuve un problema con las entradas duplicadas en una tabla. A continuación se muestran los enfoques que estaban trabajando para mí. También ha sido defendido por @sibaz.
Finalmente lo resolví usando las siguientes consultas:
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;
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 aconsejo un mejor enfoque que conozca.
Las consultas anteriores son para el servidor MySql.
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.
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 el caso de que tengas que combinar y actualizar entre dos tablas.
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];