0

選択クエリを更新とマージできるはずであることを示すいくつかの優れたリソースを見つけましたが、正しいフォーマットについて頭を悩ませることができません。

accountID情報を取得している選択ステートメントがあり、それらの結果を使用して、選択クエリの に一致するアカウント テーブルを更新したいと考えています。

選択ステートメントは次のとおりです。

SELECT DISTINCT SUM(b.workers)*tt.mealTax as MealCost,b.townID,b.accountID
FROM buildings AS b
INNER JOIN town_tax AS tt ON tt.townID = b.townID
GROUP BY b.townID,b.accountID

要するに、上記のクエリを次のものとマージしたいと思います。

UPDATE accounts AS a
SET a.wealth = a.wealth - MealCost

MealCost選択クエリの結果はどこにありますか。これを 1 つにまとめる方法があると確信していますが、2 つのクエリに分割せずにドットを接続して一貫して実行することができませんでした。

4

1 に答える 1

1

まず、group by がある場合、distinct は必要ありません。

第二に、2 つの結果をどのようにリンクするつもりですか? SELECT クエリは、アカウントごとに複数の行 (町ごとに 1 行) を返しています。おそらく、accounts テーブルには 1 つの行しかありません。更新の平均 MealCost が必要だとしましょう。

これを取得する選択クエリは次のとおりです。

SELECT accountID, avg(MealCost) as avg_Mealcost
FROM (SELECT SUM(b.workers)*tt.mealTax as MealCost, b.townID, b.accountID
      FROM buildings AS b INNER JOIN
           town_tax AS tt
           ON tt.townID = b.townID
      GROUP BY b.townID,b.accountID
     ) a
GROUP BY accountID

これを更新に入れるには、次のような構文を使用できます。

UPDATE accounts
    set accounts.wealth = accounts.wealth + asum.avg_mealcost
    from (SELECT accountID, avg(MealCost) as avg_Mealcost
          FROM (SELECT SUM(b.workers)*tt.mealTax as MealCost, b.townID, b.accountID
                FROM buildings AS b INNER JOIN
                     town_tax AS tt
                     ON tt.townID = b.townID
                GROUP BY b.townID,b.accountID
               ) a
          GROUP BY accountID
         ) asum
    where accounts.accountid = asum.accountid

これは SQL Server 構文を使用しますが、これは Oracle や他のほとんどのデータベースと同じだと思います。Mysql は "set" の前に "from" 句を置き、"update accounts" でエイリアスを許可します。

于 2012-05-30T02:22:48.330 に答える