2013-08-26 33 views
0

我有一個數據MySQL的更新與單個SQL多個表來獲得總和(數量)

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 

我想更新總和(detail.qty)掌握兩個表,並設置其標誌爲1 ,所以我已經寫了查詢

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

我有guesed MASTER.QTY應該是從細節表30(10 + 20)。 但它只更新第一個值 實際值是MASTER.QTY = 10(只從表中更新第一個值)

我怎樣才能獲得MASTER.QTY = 30?

+0

多少行你期望在DETAIL表中有嗎? – DanFromGermany

+1

我同意主表可能是不必要的(這可能是一個視圖)。但是你的另一張桌子需要PK – Strawberry

回答

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

0

IMO,您的主表是不必要的。如果行數不在> 5位數範圍內,則不需要它。

這等於主表:

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