MySQL - actualizar a pesquisa com base na selecção da pesquisa

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

um conjunto de dados conterá a data-hora final de certos eventos e o outro conjunto de dados conterá a data-hora inicial de outros eventos.

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

O que 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, junto-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 na minha campo validation_check, executa uma pesquisa de actualização com a selecção aninhada?

Author: linuxbuild, 2009-08-12

12 answers

Você pode realmente fazer isso de duas maneiras:

A actualização do MySQL junta-se à sintaxe:

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.
 642
Author: Eric, 2018-09-20 21:19:02
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.
 233
Author: massquote, 2018-07-20 09:53:21

Fácil em MySQL:

UPDATE users AS U1, users AS U2 
SET U1.name_one = U2.name_colX
WHERE U2.user_id = U1.user_id
 79
Author: Sergio, 2017-07-06 10:06:19
Se alguém está a tentar actualizar dados de uma base de dados para outra, independentemente da tabela a que se destinam, deve haver alguns critérios para o fazer.

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 a compreensão acima, você pode modificar os campos definidos e os critérios " on " para fazer o seu trabalho. Você também pode realizar as Verificações, em seguida, puxar os dados para a(S) tabela (s) temp e, em seguida, executar a atualização usando a sintaxe acima substituindo o seu nomes de tabelas e Colunas.

Espero que funcione, se não me avisares. Vou escrever uma pergunta exacta para si.
 44
Author: KMX, 2012-05-04 12:11:51
Encontrei esta questão ao procurar a minha própria solução para uma união muito complexa. Esta é uma solução alternativa, para uma versão mais complexa do problema, que eu pensei que poderia ser útil.

Eu precisava de povoar o campo product_id na tabela actividades, onde as actividades são numeradas numa unidade, e as unidades são numeradas num nível (identificadas com uma cadeia de caracteres ??N), de modo que se possa identificar atividades usando um SKU ie L1U1A1. Esses SKUs são então armazenados em uma mesa diferente.

Identifiquei o seguinte para obter uma 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)

Eu descobri que isso era muito complexo para incorporar em uma seleção dentro do mysql, então eu criei uma tabela temporária, e juntei isso com a declaração de atualização: -

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 alguém ache isto útil.
 11
Author: sibaz, 2014-08-15 14:39:33
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 isto o ajude num caso em que tem de combinar e actualizar entre duas tabelas.

 10
Author: Don, 2018-09-05 09:46:27

Poderá actualizar os valores de outra tabela usando a junção 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 aqui para saber como usar esta consulta http://www.voidtricks.com/mysql-inner-join-update/

Ou pode usar o select as subquery para fazer isto

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

A consulta explicada nos detalhes aqui http://www.voidtricks.com/mysql-update-from-select/

 4
Author: Anand Roshan, 2015-10-15 00:52:41
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];
 4
Author: bhavik, 2016-11-21 05:32:56

Pode usar:

UPDATE Station AS st1, StationOld AS st2
   SET st1.already_used = 1
 WHERE st1.code = st2.code
 2
Author: SergeyUr, 2017-03-03 06:29:09

Para a mesma tabela,

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;
 1
Author: Gnanam pragasam, 2017-12-01 16:55:43

Eu tinha um problema com entradas duplicadas numa tabela. Abaixo estão as abordagens que estavam trabalhando para mim. Ela também foi defendida por @sibaz.

Finalmente resolvi-o usando as consultas abaixo:

  1. A pesquisa de selecção é gravada numa tabela temporária

    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. A tabela temp é junta na consulta de actualização.

    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
    )
    

Não tenho muita experiência com SQL por favor, aconselhe qualquer abordagem melhor que você conhece.

As consultas acima são para o MySql. servidor.
 0
Author: Rick, 2018-05-11 08:13:55

Verifique com a pesquisa abaixo.

Actualizar o quadro A entrada interna tableB B on A. name_a = B. name_b definir validation_check = if (start_ DTS > end_ DTS, 'válido', ")

 0
Author: Anoop Kumar, 2018-10-05 11:16:17