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?
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.
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.
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
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.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.
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.
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/
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];
Pode usar:
UPDATE Station AS st1, StationOld AS st2
SET st1.already_used = 1
WHERE st1.code = st2.code
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;
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:
-
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;
-
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.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', ")