0

データベースの厄介な獣に対して作成する必要のあるストアドプロシージャがいくつかあります。テーブル(アプリケーション)をループし、アプリケーションテーブルのapplication_idを使用して、他のテーブル(一部は誇張/平均/ etc値)から値を引き出す必要があります。

これまでのところ:

declare @id INT
declare app cursor for
    SELECT application_id from application
OPEN app
FETCH NEXT FROM app 
INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT a.NAME_LAST, a.NAME_FIRST, ca.status, (SELECT AVG(score) FROM reviews WHERE application_id = @id), (SELECT count(*) FROM reviews WHERE application_id = @id)  FROM application a, committee_applications ca WHERE a.application_id = ca.application_id AND a.application_id = @id
  FETCH NEXT FROM app INTO @id
END
CLOSE app
DEALLOCATE app

それは私が望む結果を私に与えています、しかし私はこれをするよりきれいな方法があると確信しています、そして私はこれを正しくするために今日精神的なジャンプをすることができないようです。これは私には本当に醜いように見えるので、誰かがこれを行うためのより良い方法を指摘できますか?

また、SELECTステートメントを1つずつ実行するのではなく、これらの値を一時テーブルに格納してから、完全な結果を返す必要があるようです。

任意の提案をいただければ幸いです。

ありがとう。

4

1 に答える 1

2

カーソルを削除すると、おそらくこれが大幅に高速化されます。派生テーブルを使用すると、1 つのクエリでカウントと平均を取得し、それを他のテーブルに結合して残りの列を取得できます。このような....

SELECT a.NAME_LAST, 
       a.NAME_FIRST, 
       ca.status, 
       Scores.AverageScore,
       Scores.CountScore
FROM   application a
       Inner Join committee_applications ca 
         On a.application_id = ca.application_id
       Left Join (
         SELECT application_id, 
                AVG(score) As AverageScore, 
                Count(*) As CountScore
         FROM   reviews 
         Group By application_id
         ) As Scores
         On a.application_id = Scores.application_id
于 2009-06-24T22:27:45.930 に答える