4

テーブル:

mysql> select * from table1;
+------+------+------+
| no   | nm   | unit |
+------+------+------+
|    1 | ABC  |   10 |
|    2 | ACX  |   20 |
|    3 | AYU  |   30 |
+------+------+------+
3 rows in set (0.01 sec)

mysql> select * from table2;
+------+------+------+
| no   | nm   | unit |
+------+------+------+
|    1 | ABC  |   40 |
|    2 | ACX  |   20 |
+------+------+------+
2 rows in set (0.00 sec)

必要な出力:

mysql> select * from table2;
+------+------+------+
| no   | nm   | unit |
+------+------+------+
|    1 | ABC  |   50 |
|    2 | ACX  |   40 |
|    3 | AYU  |   30 |
+------+------+------+
3 rows in set (0.00 sec)
4

4 に答える 4

1

Table2必要な出力として更新する場合は、まず既存の行を更新してから、新しい行を挿入する必要がありTable1ます。

次を使用してユニットを更新できますJOIN

UPDATE Table2 t2
  JOIN 
       (SELECT nm, SUM(unit) unit
       FROM
       (
           SELECT * FROM Table1 t1
           UNION ALL
           SELECT * FROM Table2 t2
       ) tbl
       GROUP BY nm
       ) tbl1
    ON t2.nm = tbl1.nm
   SET t2.unit = tbl1.unit;

次に、Table2 に存在しない Table1 から行を追加できます (例nm=AYU)

INSERT INTO Table2
SELECT t1.`no`, t1.`nm`, t1.`unit`
  FROM Table1 t1
  LEFT JOIN Table2 t2
    ON t1.nm = t2.nm
 WHERE t2.nm IS NULL;

出力:

SELECT * FROM Table2;
| NO |  NM | UNIT |
|----|-----|------|
|  1 | ABC |   50 |
|  2 | ACX |   40 |
|  3 | AYU |   30 |

このSQLFiddleを参照してください

最初にテーブルを更新することを忘れないでください。そうしないと、ユニットが複製されます。

于 2013-09-03T05:13:26.987 に答える