2009-06-24 2 views
0

데이터베이스의 불쾌한 짐승에 대해 필 요한 저장 프로 시저가 있습니다. 응용 프로그램 테이블에서 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 

것은 나에게 내가 원하는 결과를 제공,하지만 난이 일을 깨끗한 방법이 확신 해요, 나는 정신 점프를 할 수없는 것 인 오늘 이것을 올바로 수행하십시오. 이것이 나에게 정말로 못 생기는 것처럼 누군가가 이것을하는 더 좋은 방법을 지적 할 수 있습니까?

또한이 값을 임시 테이블에 저장 한 다음 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의 나머지 부분을 해머에 넣어야합니다. –

관련 문제