0

私は自分の問題に対する答えを探していましたが、役に立ちませんでした。問題は次のとおりです。SQL の単一の UPDATE ステートメントで値を複数回更新しようとすると、常に 1 回更新されます。あたかも UPDATE ステートメントがテーブルのコピーに対して機能し、元のテーブルの値を常に上書きしているように見えるため、結果のテーブルには、値が value=value で設定された回数ではなく、1 だけインクリメントされた値が含まれます。 +1。

次に例を示します。

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 人にする必要があります。よろしくお願いします。

4

3 に答える 3

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
于 2013-06-26T16:32:38.397 に答える
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 つのステートメントから 1 の複数のインクリメントを取得できるとは思いません。代わりに、何らかの形式のカウントを使用する必要があります。

于 2013-06-26T16:31:59.113 に答える
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

多分。

クエリを実行するたびに、一致する子が少なくとも 1 人いるすべての家の子の数を増やしているだけです。

于 2013-06-26T16:35:32.003 に答える