MySQL - Consulta de atualização baseada em SELECT Query

Preciso verificar (a partir da mesma tabela) se existe uma associação entre dois eventos com base na data e hora.

Um conjunto de dados conterá a data/hora final de certos eventos e o outro conjunto de dados conterá a data/hora inicial para outros eventos.

Se o primeiro evento terminar antes do segundo, eu gostaria de ligá-los.

O que eu tenho até agora é:

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

Então eu juntei-me a eles:

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

Posso então, com base no meu campo validation_check, executar uma consulta UPDATE com o aninhado SELECT?

Solução

Você pode fazer isso de duas maneiras:

MySQL update join syntax:

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

Sintaxe ANSI SQL:

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)

Escolhe o que te parecer mais natural.

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

Espero que isto funcione para ti.

Comentários (3)

Se alguém está procurando atualizar dados de uma base de dados para outra, não importa qual a tabela que está buscando, deve haver alguns critérios para fazer isso.

Este é melhor e limpo para todos os níveis:

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 muito bem!

Com o entendimento acima, você pode modificar os campos e "on" critérios para fazer o seu trabalho. Você também pode executar as verificações, depois puxar os dados para a(s) tabela(s) temporária(s) e depois executar a atualização usando a sintaxe acima substituindo os nomes da sua tabela e coluna.

Espero que funcione, se não me avisar. Vou escrever uma pergunta exacta para si.

Comentários (0)