2

以下で思いついたこのコードを入力するのは気が進まない:

UPDATE a_fees
SET active = 'N'
WHERE EXISTS
(
SELECT fee_id, (
audit_fees + audit_related_fees + tax_fees + other_fees
) AS total_fees
FROM a_fees
WHERE verified = 'N'
GROUP BY fee_id
HAVING total_fees < 5000);

これと同様のコード(以下)を実行すると、返されるテーブルのすべての結果が返されるため、上記のコードはテーブルのすべてのレコードを更新すると思います。副選択を行うと、関係する部分のみが返されます。ただし、最も外側の選択ステートメントを追加すると、テーブル全体が返されます。

SELECT fee_id
FROM a_fees
WHERE EXISTS (

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

4つの列の合計が$5,000未満であるテーブルのレコードに対して、active='N'を設定する方法についてのアドバイスは素晴らしいでしょう。前もって感謝します。

4

1 に答える 1

1

サブクエリが少なくとも1つの行を返す場合、EXISTS条件が満たされていると見なされます。そうです、最初のUPDATEはテーブルのすべてのレコードを更新する可能性があります。

EXISTSの代わりにIN句を使用する必要があります。また、fee_idは一意であるため、GROUPBY句を使用する必要はありません。

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

または、サブクエリに条件を設定する必要があります。

SELECT fee_id
FROM a_fees
WHERE EXISTS (
  SELECT fee_id
  FROM a_fees a_fees_1
  WHERE
    verified =  'N'
    AND a_fees_1.fee_id = a_fees.fee_id
    AND audit_fees + audit_related_fees + tax_fees + other_fees <5000);
于 2012-10-31T10:05:12.823 に答える