2009-06-24 8 views
0

Ich habe einige gespeicherte Prozeduren, die ich gegen eine böse Biest einer Datenbank schreiben muss. Ich muss eine Tabelle (Anwendung) durchlaufen und Werte aus anderen Tabellen (einige sind aggerate/Durchschnitte/etc Werte) mit der application_id aus der Anwendungstabelle ziehen.T-SQL-Schleife, um ein Recordset zu erstellen

Bisher habe ich:

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 

die mir die Ergebnisse schenkt ich will, aber ich bin sicher, es ist ein sauberer Weg, dies zu tun, und ich kann nicht die mentale Sprung zu machen scheinen heute, um das richtig zu machen. Könnte jemand darauf hinweisen, dass dies für mich wirklich hässlich ist?

Es scheint auch, dass ich diese Werte in einer temporären Tabelle speichern sollte und dann die vollständigen Ergebnisse zurückgeben sollte, anstatt die SELECT-Anweisung nacheinander auszuführen.

Alle Vorschläge würden sehr geschätzt werden.

Danke.

Antwort

2

Das Entfernen des Cursors wird das wahrscheinlich sehr beschleunigen. Indem Sie eine abgeleitete Tabelle verwenden, können Sie die Zählungen und Mittelwerte mit einer Abfrage abrufen und diese zu den anderen Tabellen zurückführen, um die verbleibenden Spalten zu erhalten. So ...

+0

Danke, das rockt und ist was ich gesucht habe. Ich wusste, dass es viel sauberer war. Jetzt muss ich einfach den Rest dieses verrückten SQL hinein hämmern. –

Verwandte Themen