创建记录集的T-SQL循环

创建记录集的T-SQL循环,sql,tsql,cursors,Sql,Tsql,Cursors,我有一些存储过程,我需要针对一个讨厌的数据库编写。我需要循环遍历一个表(应用程序),并使用应用程序表中的应用程序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

我有一些存储过程,我需要针对一个讨厌的数据库编写。我需要循环遍历一个表(应用程序),并使用应用程序表中的应用程序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语句

如有任何建议,将不胜感激


谢谢。

删除光标可能会大大加快速度。通过使用派生表,您可以通过一个查询获取计数和平均值,并将其连接回其他表以获取其余列。像这样

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

谢谢,这是我一直在寻找的。我知道有一种更干净的方法。现在我只需要把剩下的这些疯狂的SQL注入其中。