私はいつも、データベースから複数の行がどのように選択され、それらの列の1つ以上がオンザフライで更新されるのか疑問に思っていました。たとえば、検索エンジンを考えてみましょう。ここでは、何千もの結果が取得され、ビュー数が更新されます(単一のクエリを使用)。
それは可能ですか?それを達成するために特別なSQL機能を使用していますか?
PS:この質問が以前に尋ねられた場合、私が同じものを見つけられなかったので私に紹介してください、そしてそれが不完全であるならば、私は知っています。
たとえば、Googleがどのようにそれを行うかを考えると、彼らはBigtableを使用しています(議論についてはこの質問を参照してください)私はそれが内部でどのように機能するかについて何も知らないのでコメントできません。
あなたの質問に関しては、aselect
とupdate
inを一度に行うことはできません-純粋なSQLでは、つまり。ただし、ストアド関数を使用してこれを行うことは可能です。次の関数(擬似コード)を検討してください
create function select_and_update(criteria) returns setof data_rows
as
begin
update some_table set view_count = view_count + 1 where criteria;
return set "select * from some_table where criteria";
end;
次に、アプリケーションで、1つのデータベース呼び出しを行うことができます。
SELECT * FROM select_and_update(criteria)
このように、アプリケーションからの「ヒット」は1つだけです(つまり、データベース接続に対してアプリケーションから1つのクエリのみを実行しています)が、内部的にビューカウントが更新され、データが返されます。
もちろん、詳細はデータベースエンジンと特定のニーズによって異なりますが、私はこの手法を私のWebサイトで非常に広範囲に使用しています。
データがリレーショナルデータベースに格納されていると仮定すると、答えは、取得が単一の選択を介して行われないということです。私は2つの方法を考えることができます。
最初に、ストアドプロシージャまたはテーブル値のユーザー定義関数を介して取得を実行します。コードは結果をフェッチして更新を実行し、結果を返します。
または、カーソルを使用して検索することもできます。カーソルのタイプの1つは更新可能なカーソルです。これにより、呼び出し元は1回の呼び出しでデータを読み取って更新できます。更新可能なカーソルは一般的にかなり遅いので、あまり使用されません。
私があなたの質問を正しく理解しているのなら、なぜjoin
2つの表を使わないのですか?このようなもの、
UPDATE table1 t1
INNER JOIN
(
SELECT id, count(*) totalCount
FROM tableName
GROUP BY id
) t2
ON t1.id = t2.id
SET t1.col1 = t2.totalCount