0

したがって、3 つのテーブルがあり、最初の 2 つの値を計算し、3 番目のテーブルのフィールドをその値で更新する必要があります。エラーが発生します。

UPDATE Characters AS c
SET c.Total_DKP = (
(SELECT c.Initial_DKP
FROM c
WHERE c.Name='harrian')-
(SELECT SUM(a.DKP_Change)
FROM Attendance AS a 
WHERE a.Name = 'harrian')
              )
WHERE c.Name = 'harrian' ;

それはエラーを与える

Table 'harrian.c' doesn't exist

しかし、私が走るとき

UPDATE Characters AS c
SET c.Total_DKP = ( SELECT SUM(a.DKP_Change) 
                    FROM Attendance AS a 
                    WHERE a.Name = 'harrian'
                  )
WHERE c.Name = 'harrian'

問題はありません。最初のブロックの何が問題なのか誰か教えてもらえますか?

ここに完全なクエリがあります-

UPDATE Characters AS c
SET c.Total_DKP = (
(SELECT c.Inital_DKP FROM Characters AS c WHERE c.Name = 'harrian')
+(SELECT SUM(a.DKP_Change) FROM Attendance AS a WHERE a.Name = 'harrian')
+(SELECT SUM(b.Cost) FROM Raid_Drops AS b WHERE b.Player_Name = 'harrian')
)
WHERE c.Name = 'harrian' ;

私は今、このエラーが発生しています

You can't specify target table 'c' for update in FROM clause
4

2 に答える 2

1

最初のサブクエリは次のとおりです。

SELECT c.Initial_DKP FROM c WHERE c.Name='harrian'

FROM c私はあなたが意味すると思う代わりにFROM Characters

SELECT Initial_DKP FROM Characters WHERE Name='harrian'

しかし、その場合、UPDATE 全体は次のように記述したほうがよいでしょう。

UPDATE Characters AS c
SET c.Total_DKP = c.Initial_DKP - (
  SELECT SUM(a.DKP_Change)
  FROM Attendance AS a 
  WHERE a.Name = 'harrian'
)
WHERE c.Name = 'harrian';

update ステートメントは、サブクエリで更新しているテーブルを使用できないためです。

于 2012-12-07T21:58:23.133 に答える
0

Name = 'harrian'in tableで複数の行が存在できない場合Characters(例: Nameisの場合UNIQUE)、次を使用できます。

UPDATE Characters AS c
SET c.Total_DKP = (
  c.Inital_DKP
  + (SELECT SUM(a.DKP_Change) FROM Attendance AS a WHERE a.Name = 'harrian')
  + (SELECT SUM(b.Cost) FROM Raid_Drops AS b WHERE b.Player_Name = 'harrian')
  )
WHERE c.Name = 'harrian' ;

上記の一部の括弧は不要です。また、空のテーブルに対して行が生成される、Attendanceまたは行がない場合を避けるために、Null をゼロに変換する必要があります。Raid_DropsName = 'harrian'NULLSUM()

UPDATE Characters AS c
SET c.Total_DKP = 
  c.Inital_DKP
  + COALESCE( (SELECT SUM(a.DKP_Change) FROM Attendance AS a 
               WHERE a.Name = 'harrian')
            ), 0)
  + COALESCE( (SELECT SUM(b.Cost) FROM Raid_Drops AS b 
               WHERE b.Player_Name = 'harrian')
            ), 0)
WHERE c.Name = 'harrian' ;
于 2012-12-07T22:57:24.583 に答える