2009-06-24 5 views
0

J'ai certaines procédures stockées que j'ai besoin d'écrire contre une bête méchante d'une base de données. Je dois parcourir une table (application) et extraire des valeurs d'autres tables (certaines sont des valeurs aggerate/averages/etc) en utilisant l'id_application de la table d'application.Bouclage T-SQL pour créer un jeu d'enregistrements

Jusqu'à présent, j'ai:

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 

Ce qui me donne les résultats que je veux, mais je suis sûr qu'il ya un moyen plus propre de le faire, et je ne peux pas sembler faire le saut mental aujourd'hui pour le faire correctement. Quelqu'un pourrait-il indiquer une meilleure façon de le faire car cela me semble vraiment moche.

En outre, il semble que je devrais stocker ces valeurs dans une table temporaire, puis renvoyer les résultats complets au lieu d'exécuter l'instruction SELECT un par un.

Toutes les suggestions seraient grandement appréciées.

Merci.

Répondre

2

Si vous supprimez le curseur, cela accélèrera probablement beaucoup. En utilisant une table dérivée, vous pouvez obtenir les comptes et les moyennes avec une requête et la joindre aux autres tables pour obtenir les colonnes restantes. Comme ça ....

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

Merci, ça berce et c'est ce que je cherchais. Je savais qu'il y avait une façon beaucoup plus propre de le faire. Maintenant, je dois juste marteler le reste de ce SQL fou en elle. –

Questions connexes