「SQLでループを使用している場合、おそらく間違っている」と読んだので、ここにたどり着きました。ただし、質問の前に、シナリオの背景について説明します。次のデータベース構造があります。
- 「ユーザー」には次のものがあります。
- UserID int IDENTITY (PK)
- 信頼性フロート
- 「UserSubmissions」には次のものがあります。
- バリューフロート
- UserID int (FK) (PK)
- SubmissionID (FK) (PK)
- タイムスタンプ日時 (PK)
- 「GlobalSubmissions」には次の機能があります。
- IdealValue フロート
- 提出ID (PK)
GlobalSubmissions は、理想的にはユーザーが送信する必要がある理想的な値を含むテーブルと考えてください。UserSubmissions は、ユーザーが送信した値を含むテーブルです。
ユーザーの「送信」を単一の特定の「globalSubmission」と比較することで、ユーザーの信頼性を推定する関数を作成しました。
CREATE FUNCTION dbo.GetUserReliabilityForSubmission(@userID int, @submissionID int)
RETURNS float
AS
BEGIN
DECLARE @userAverageValue float,
@idealValue float;
SET @userAverageValue = (
SELECT AVG (Value)
FROM UserSubmissions
WHERE (UserID = @userID AND SubmissionID = @submissionID));
SET @idealValue = (
SELECT IdealValue
FROM Submission
WHERE (SubmissionID = @submissionID));
RETURN 1 - ABS(@userAverageValue - @idealValue);
END
これは機能しますが、特定の 1 つの送信 ID のみに基づいてユーザーの信頼性を計算します。ユーザーの「グローバルな」信頼性を計算したい場合は、ループを使用して、ユーザーがこれまでに送信したすべての個別のSubmissionIDを調べて、その手順を実行する必要があります。
この場合、ループを使用する代わりに良い方法はありますか?