2013-06-26 37 views
0

我一直在尋找對我的問題的答案,但無濟於事。 問題如下,當我嘗試在SQL中的單個UPDATE語句上多次更新一個值時,它總是會更新一次。就好像UPDATE語句正在處理我的表的一個副本並始終覆蓋原始表上的值,因此結果表只將值增加1,而不是通過value = value設置值的次數+1。在單個UPDATE上不止一次在mysql上增加值

下面是一個例子:

UPDATE Home, Person 
SET Home.NumberOfChilds=Home.NumberOfChilds+1 
WHERE Home.State= Person.State 
AND Home.ZoneCode = Person.ZoneCode 
AND Home.Address = Person.Address 
AND Person.IsChild = true; 

在這種情況下,如果一個家庭有3個孩子的所產生的孩子的數量會是1的那家,當我需要它爲3。在此先感謝。

+0

你的模式是什麼? – wazy

+0

這只是一個例子,因爲JOIN更長,我的表格和屬性不是英文的。 State,ZoneCode和Adress將成爲Home的PK,而State,ZoneCode,Adress和NumberOfPerson將成爲Person的PK,前三個將是FK參考Home。 NumberOfChilds是一個十進制(4,0)。希望它有幫助,謝謝你的興趣。 – eduedu87

回答

1

可能做一個子查詢計數參加了對您的主表: -

UPDATE Home 
INNER JOIN (SELECT State, ZoneCode, Address, COUNT(*) AS PersonCount FROM Person WHERE IsChild = true GROUP BY State, ZoneCode, Address) Sub1 
ON Home.State= Sub1.State 
AND Home.ZoneCode = Sub1.ZoneCode 
AND Home.Address = Sub1.Address 
SET Home.NumberOfChilds = Home.NumberOfChilds + Sub1.PersonCount 
+0

謝謝,它工作!花了一分鐘。 – eduedu87

0

這適用於Sql Server 2008R2,目前我無權訪問mysql系統進行測試。

UPDATE H 
SET H.NumberOfChilds = ( 
    SELECT COUNT(*) FROM Person AS P 
    WHERE H.State = P.State 
    AND H.ZoneCode = P.ZoneCode 
    AND H.Address = P.Address 
    AND P.IsChild = 1)      
FROM Home AS H 

我不認爲你將能夠從一個單獨的語句得到1倍數的增量,您將需要使用某種形式的計數來代替。

+0

感謝您的回答,我忘記提及我的桌子有數百萬行,並且該解決方案需要花費太多時間才能完成,但我確定它會起作用 – eduedu87

+0

我的答案可能會表現出同樣的弱點,儘管索引可能有幫助這可能是代理鍵,例如Person.HomeId。除此之外,您可能不得不考慮通過觸發器或存儲過程構建輸出 –

+0

這依賴於可能表現不佳的相關子查詢。我的解決方案和@TonyHopkinson非常類似的解決方案不應該以這種方式受到影響。 – Kickstart

0

喜歡的東西

Update h 
Set h.NumberOfChilds = c.ChildCount 
From Home h 
inner join (Select ZoneCode, Address, Count(*) as ChildCount 
      From Person Where IsChild = true Group By ZoneCode,Address) c 
On c.ZoneCode = h.ZoneCode and c.Address = h.Address 

可能。

您所做的只是每次運行查詢時爲所有家庭增加子女人數,並至少有一個匹配的子女。

+0

感謝您的回答,它就像我告訴Kickstart一樣。 – eduedu87

相關問題