2013-06-26 31 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

相关问题