2009-06-24 65 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语句。

任何建议将不胜感激。

谢谢。

回答

2

删除光标可能会加速很多。通过使用派生表,您可以使用一个查询获取计数和平均值,并将其返回到其他表以获取剩余的列。像这样....

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的其余部分加入其中。 – 2009-06-24 22:37:23