誰かが私のフレーズを援助することができたとしても、SQL Server - サブクエリの結果でグループごとにすべてのレコードを更新
私はSQL Serverテーブルを持っています。車と呼ぶことにしましょう。car_id、owner_accountNumber、owner_numCarsなどの所有者に関する項目と情報を表すエントリが含まれています。
私たちは所有している車の台数に基づいて「所有者の重要性」を分類するシステムを使用しています。そのためにowner_numCars列に依存しています。合理的に可能であれば、これを調整しないでください。
ストアドプロシージャを使用してowner_accountNumberごとにowner_numCarsを更新する方法はありますか?多分私はowner_accountNumberごとのエントリの数を含むすべてのowner_numCarsを達成することができる他のより効率的な方法?
今、私はこれを行うに考えることができる唯一の方法は、へ(C#アプリケーションから)です:
SELECT owner_accountNumber, COUNT(*)
FROM mytable
GROUP BY owner_accountNumber;
、その後、foreachの行は
UPDATE mytable
SET owner_numCars = <count result>
WHERE owner_accountNumber = <accountNumber result>
、そのクエリによって返された。しかし、これは乱暴に思えますサーバーがロジックと更新を処理するのに比べて非効率的です。
編集 - すべての助けをいただきありがとうございます。私はこれが本当にうまくセットアップされたデータベースではないことを知っていますが、それは私が作業しなければならないものです。私は皆様のご意見とアドバイスを感謝します。
あなたは、何百万ものレコードを維持し、挿入/更新/削除中にその値を維持するのに最適であるキャッシュされた非正規化値を持つ場合に有効な点があります。そして、それを行う1つの場所はストアドプロシージャになります。ただし、一度に1つのowner_accountNumberを処理する場合、派生列はウィンドウ関数との大きな違いはありません。あなたの答えを広げ、ストアドプロシージャがどのように書けるかを示します。または、私は通常、これをトリガと言って嫌いです。カスタムタイプを使用しない限りSPは複数の行の変更を許可しないため、 – Matt
はい、あなたのポイントが表示されます。私はこのようにデザインしません。私はトリガーを考えましたが、ここでその話題に取り掛かりたくありませんでした。 – LAS
合意私はトリガーから離れて何百万という行を扱うときにはほとんどすべて可能です:) – Matt