0

a_fees テーブルを更新しようとすると、次のエラーが表示されるのはなぜですか? 私が収集できることから、更新中のテーブルに基づいてサブ選択基準を作成することはできませんか? SQL が逆に読み取られるためでしょうか。どうすればこれを回避できますか?

エラー メッセージ: 1093 - FROM 句での更新にターゲット テーブル 'a_fees' を指定できません

UPDATE a_fees
SET active = 'N'
WHERE a_fees.fee_id IN
(
SELECT fee_id
FROM a_fees
WHERE verified = 'N'
HAVING audit_fees + audit_related_fees + tax_fees + other_fees < 5000);
4

1 に答える 1

0

HAVING 句は GROUP BY 句と組み合わせて使用​​され、次のように HAVING 句で SUM などの集計関数を使用する必要があります。

SELECT fee_id
FROM a_fees
WHERE verified = 'N'
GROUP BY fee_id
HAVING SUM(audit_fees + audit_related_fees + tax_fees + other_fees) < 5000;

this sums autid_feesaudit_related_feestax_feesおよびother_fees同じ fee_id を持つすべての行に対して、< 5000 かどうかを確認します。

しかし、fee_id が一意の場合、合計する必要があるすべてのフィールドが同じ行にあることを意味するため、GROUP BY 句を使用する必要はなく、クエリは次のように簡略化できます。

SELECT fee_id
FROM a_fees
WHERE
  verified = 'N'
  AND (audit_fees + audit_related_fees + tax_fees + other_fees) < 5000;

UPDATE クエリは次のようになります。

UPDATE a_fees
SET active = 'N'
WHERE a_fees.fee_id IN (
  SELECT fee_id
  FROM a_fees
  WHERE verified = 'N'
    AND audit_fees + audit_related_fees + tax_fees + other_fees < 5000);

その通りです。MySql では、select 部分で使用しているのと同じテーブルを更新することはできず、JOINS だけを使用して更新クエリを書き直す必要があります。

しかし、fee_id が一意の場合、サブクエリを使用する必要はなく、サブクエリを使用せずに UPDATE のみを使用することをお勧めします。

UPDATE a_fees
SET active = 'N'
WHERE verified = 'N'
  AND audit_fees + audit_related_fees + tax_fees + other_fees < 5000;
于 2012-10-31T11:32:42.840 に答える