2009-06-24 4 views
0

データベースの厄介な獣に対して書きたいストアドプロシージャがいくつかあります。私はテーブル(アプリケーション)をループし、アプリケーションテーブルからapplication_idを使用して他のテーブルから値を引き出す必要があります(いくつかはaggerate/averages/etc値です)。T-SQLループしてレコードセットを作成する

これまでのところ、私が持っている:

私が望む結果を与えている
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つずつ実行する代わりに完全な結果を戻す必要があるようです。

ご意見をいただければ幸いです。

ありがとうございました。

答えて

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 
+0

ありがとう、その岩は私が探していたものです。私はそれを行うためのきれいな方法があることを知っていた。今私はちょうどそれに狂ったSQLの残りの部分をハンマーする必要があります。 –

関連する問題