2009-06-24 5 views
0

У меня есть несколько хранимых процедур, которые мне нужно написать против неприятного зверя базы данных. Мне нужно пройти через таблицу (приложение) и вывести значения из других таблиц (некоторые из них - значения aggerate/average/etc), используя application_id из таблицы приложений.Цикл 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 

Что дает мне результаты, я хочу, но я уверен, что есть более чистый способ сделать это, и я не могу сделать психическое прыжок сегодня сделать это правильно. Может ли кто-то указать на лучший способ сделать это, поскольку это кажется мне действительно уродливым.

Кроме того, мне кажется, что я должен хранить эти значения в таблице temp, а затем возвращать полные результаты вместо того, чтобы запускать инструкцию 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. –

Смежные вопросы