0

我有两个数据表

CREATE TABLE `MASTER` (
  `NAME` VARCHAR(10)      NOT NULL,
  `QTY`  INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`NAME`)
);
NAME  | QTY
----------
'ABC' | 0
'XYZ' | 0
CREATE TABLE `DETAIL` (
  `NAME` VARCHAR(10)         NOT NULL,
  `QTY`  INT(10) UNSIGNED    NOT NULL,
  `FLAG` TINYINT(1) UNSIGNED NOT NULL
);
NAME  | QTY| FLAG
--------------------
'ABC' | 10 | 0
'ABC' | 20 | 0
'PQR' | 15 | 0
'PQR' | 25 | 0

我想将 sum(detail.qty) 更新为 master 并将其标志设置为 1 所以我写了查询

UPDATE MASTER M, DETAIL D
SET M.QTY = M.QTY + D.QTY,
  D.FLAG =1
WHERE M.NAME = D.NAME;

我从详细信息表中猜到 MASTER.QTY 应该是 30 (10 + 20)。但它只更新第一个值实际值是 MASTER.QTY =10 (只更新表中的第一个值)

我怎样才能得到 MASTER.QTY =30?

4

2 回答 2

0

IMO,您的主表是不必要的。如果行数不在 > 5 位范围内,则不需要它。

这等于 MASTER 表:

SELECT NAME, SUM(QTY), FLAG FROM DETAIL GROUP BY NAME;

您可以轻松地从中创建视图。

无论如何你的答案:

UPDATE MASTER m
JOIN DETAIL d ON m.NAME = d.NAME
SET
  d.FLAG = 1,
  m.QTY = (SELECT SUM(QTY) FROM DETAIL WHERE NAME = d.NAME GROUP BY NAME)
WHERE m.NAME = d.NAME

此外,始终遵循规范化规则:https ://en.wikipedia.org/wiki/Database_normalization

于 2013-08-26T11:47:41.400 回答
0

试试这个查询:

update `MASTER` m,`DETAIL` d,
(
   SELECT `NAME`, SUM( `QTY` ) as `QTY`
   FROM `DETAIL`
   GROUP BY `NAME`
) s
SET m.QTY = s.QTY,
    d.FLAG = 1
WHERE
    m.NAME = s.NAME
    AND m.NAME = d.NAME
;

SQLFiddle 演示 --> http://www.sqlfiddle.com/#!2/ab355/1

于 2013-08-26T11:52:41.020 回答