2つのテーブルがあり、どちらも
id name value
===================
1 Joe 22
2 Derk 30
各テーブルのチェック名に基づいて、value
の値をtableA
からtableB
にコピーする必要があります。
このUPDATE
ステートメントに関するヒントはありますか?
この答えに加えて、動的にtableA.valueに従ってtable.valueを変更する必要がある場合は、例えば以下のようにします。
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'
2つのテーブルを結合する必要があります。
たとえば、name
の値をtableAからtableB
にコピーし、それらが同じID
を持っているとします。
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
WHERE t2.name = 'Joe'
UPDATE 1
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
アップデート2
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.name = t2.name
SET t1.value = t2.value
2番目の可能性は
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);
2番目のオプションは、セーフ更新モードを使用している場合(そして、KEY列を使用するWHEREなしでテーブルを更新しようとしたことを示すエラーが出た場合)にも実行可能です。
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
)
**where TableB.id < X**
;
データを一時テーブルに保存する
Select * into tempTable from table1
今すぐ列を更新します
UPDATE table1
SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);
私の場合、受け入れられている解決策は遅すぎました。 180K行のテーブルの場合、更新速度は毎秒約10行でした。これはjoin要素のインデックスと一緒です。
私はついに手順を用いて私の問題を解決しました:
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
私が助けてくれたように、それが将来誰かに役立つことを願っています