我有两个数据表
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?
答案 0 :(得分: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
答案 1 :(得分: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