Цикл T-SQL для создания набора записей - PullRequest
0 голосов
/ 25 июня 2009

У меня есть несколько хранимых процедур, которые мне нужно написать для противного зверя из базы данных. Мне нужно перебрать таблицу (приложение) и вытащить значения из других таблиц (некоторые являются значениями aggerate / средние / и т.д.), используя application_id из таблицы приложения.

Пока у меня есть:

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 голосов
/ 25 июня 2009

Удаление курсора, вероятно, значительно ускорит это. Используя производную таблицу, вы можете получить значения и средние значения одним запросом и объединить их с другими таблицами, чтобы получить остальные столбцы. Вот так ....

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
...