Sql server 如何优化内部查询?

Sql server 如何优化内部查询?,sql-server,Sql Server,上面的查询将返回我期望的数据。但问题是我两次从同一个表中获取数据。使用单个select语句如何实现?这里有一种可以重写的方法: SELECT mark.student_id, . . . MAX(mark.SAVE_TIME) AS SAVE_TIME, (SELECT tamil FROM mark WHERE SAVE_TIME = (MAX(mark.SAVE_TIME))) AS tami

上面的查询将返回我期望的数据。但问题是我两次从同一个表中获取数据。使用单个select语句如何实现?

这里有一种可以重写的方法:

SELECT mark.student_id,
          .
          .
          .
          MAX(mark.SAVE_TIME) AS SAVE_TIME,
          (SELECT tamil FROM mark WHERE SAVE_TIME = (MAX(mark.SAVE_TIME))) AS tamilmark,
          (SELECT english FROM mark WHERE SAVE_TIME = (MAX(mark.SAVE_TIME))) AS englishmark
   FROM
   (.......
   )

您可以使用一个select语句来获取所有值,但也会得到null(在我的示例中,我给了它们'n/a'值)。要删除它们,您必须选择此子查询:

SELECT MySubTable.*, mark.tamil, mark.english
(
SELECT student_id,
          MAX(mark.SAVE_TIME) AS SAVE_TIME
   FROM Table
 GROUP BY student_id
) MySubTable
INNER JOIN mark
ON mark.SAVE_TIME = MySubTable.SAVE_TIME

我在您的查询中只看到两个不同的表。为什么会有问题?抱歉,更新了您的完整查询以及示例数据和预期结果。为什么您认为会有问题?如果你看一下查询计划,很可能它足够聪明,只做一次。那么你想让我们修复一个问题,而不看完整的问题,也不需要任何示例。。。?
SELECT * 
   FROM (
        SELECT DISTINCT mark.student_id,
                MAX(MARK.SAVE_TIME) OVER() AS SAVE_TIME,
                CASE WHEN SAVE_TIME = (MAX(mark.SAVE_TIME) OVER()) THEN tamil ELSE 'n/a' END AS tamilmark,
                CASE WHEN SAVE_TIME = (MAX(mark.SAVE_TIME) OVER()) THEN english ELSE 'n/a' END AS englishmark      
        FROM   MARK
   ) AS t
    WHERE tamilmark != 'n/a'