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