web-gelistirme-sc.com

mysql güncelleme sütunu başka bir tablodaki değerle

İki masam var, ikisi de benziyor

id  name  value
===================
1   Joe     22
2   Derk    30

Her tablodaki kontrol adına göre value değerini tableA'dan tableB'a kopyalamam gerekiyor.

Bu UPDATE deyimi için herhangi bir ipucu?

173
LeoSam

Bu cevaba ek olarak, tableB.value değerini tabloA.value değerine göre dinamik olarak değiştirmeniz gerekirse

UPDATE tableB
INNER JOIN tableA ON tableB.name = tableA.name
SET tableB.value = IF(tableA.value > 0, tableA.value, tableB.value)
WHERE tableA.name = 'Joe'
324
RafaSashi

iki masaya katılmanız gerekir: 

örneğin, name değerini tabloA'dan tableB içine kopyalamak istediğinizde ID

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 
WHERE t2.name = 'Joe'

GÜNCELLEME 1

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 

GÜNCELLEME 2

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.name = t2.name
SET t1.value = t2.value
136
John Woo

İkinci olasılık,

UPDATE TableB 
SET TableB.value = (
    SELECT TableA.value 
    FROM TableA
    WHERE TableA.name = TableB.name
);
76
Samir Alajmovic

İkinci seçenek, güvenli güncelleme modunu kullanıyorsanız (ve bir ANAHTAR sütunu kullanan bir WHERE olmadan bir tabloyu güncellemeye çalıştığınızı belirten bir hatayla karşılaşıyorsanız) da mümkündür: 

UPDATE TableB  
SET TableB.value = (  
SELECT TableA.value  
    FROM TableA  
    WHERE TableA.name = TableB.name  
)  
**where TableB.id < X**  
;
3
raul7

- Verilerinizi temp table .__ 'da saklayın.

--Şimdi Sütunu güncelle. GÜNCELLEME table1 SET table1.FileName = (tempTable'dan tempNable'dan FileName öğesini seçin, burada tempTable.id = table1.ID);

0
Abid Mahmood

Benim durumumda kabul edilen çözüm çok yavaştı. 180 K satır içeren bir tablo için güncelleme oranı saniyede yaklaşık 10 satırdı. Bu, birleştirme öğelerindeki dizinlerle.

Sonunda sorunumu bir prosedür kullanarak çözdüm:

CREATE DEFINER=`my_procedure`@`%` PROCEDURE `rescue`()
BEGIN
    declare str VARCHAR(255) default '';
    DECLARE n INT DEFAULT 0;
    DECLARE i INT DEFAULT 0;
    DECLARE cur_name VARCHAR(45) DEFAULT '';
    DECLARE cur_value VARCHAR(10000) DEFAULT '';
    SELECT COUNT(*) FROM tableA INTO n;
    SET i=0;
    WHILE i<n DO 
      SELECT namea,valuea FROM tableA limit i,1 INTO cur_name,cur_value;
      UPDATE tableB SET nameb=cur_name where valueb=cur_value;
      SET i = i + 1;
    END WHILE;

END

Umarım gelecekte bana yardım ettiği gibi birine yardım eder.

0
justadev