T-SQL, rendimiento repetido de subconsulta escalar en vistas.
A continuación se presenta una consulta simple que extrae los estudiantes y sus resultados en el examen. Un mismo estudiante puede realizar el mismo examen varias veces. Las subconsultas extraen los últimos resultados del examen para cada estudiante. Como se puede ver, la línea X (que extrae el último ID del examen) es exactamente la misma en cada subconsulta para cada fila. ¿Cómo almacenar o almacenar en caché el resultado de la línea X para evitar tres ejecuciones para cada fila?
No puedo usar procedimientos almacenados o funciones para esta tarea, tiene que ser una VISTA para un filtrado adicional.
SELECT S.<em>,
(
SELECT COUNT(</em>) FROM ExamAnswers WHERE
IsCorrectAnswer IS NOT NULL AND
IsCorrectAnswer = 1 AND
ExamID =
(SELECT TOP(1) ID FROM Exams E WHERE E.StudentID = S.ID ORDER BY ID DESC) --Línea X
) CorrectAnswerCount,
(
SELECT COUNT(<em>) FROM ExamAnswers EA WHERE
EA.IsCorrectAnswer IS NOT NULL AND
EA.IsCorrectAnswer = 0 AND
EA.ExamID =
(SELECT TOP(1) ID FROM Exams E WHERE E.StudentID = S.ID ORDER BY ID DESC) --Línea X
) WrongAnswerCount,
(
SELECT COUNT(</em>) FROM ExamAnswers WHERE
IsCorrectAnswer IS NULL AND
ExamID =
(SELECT TOP(1) ID FROM Exams E WHERE E.StudentID = S.ID ORDER BY ID DESC) --Línea X
) UnansweredQuestionCount
FROM Students S
davy.ai
La mejor manera de almacenar o cachear el resultado de la Línea X es utilizando una tabla temporal. Puedes crear una tabla temporal e insertar el resultado de la Línea X en ella. Luego puedes utilizar la tabla temporal en las subconsultas en lugar de ejecutar la Línea X múltiples veces.