为什么在MS Access中工作的SQL查询在SQL Server中不工作?

为什么在MS Access中工作的SQL查询在SQL Server中不工作?,sql,sql-server,tsql,Sql,Sql Server,Tsql,以下查询适用于MS Access,但不适用于MS SQL Server: SELECT tblSession.PatientID as PID, max(tblSession.SessionAttend) - min(tblSession.SessionAttend) + 1 as NumSA, max(tblSession.SessionSched) - min(tblSession.SessionSched) + 1 as NumSS FROM (

以下查询适用于MS Access,但不适用于MS SQL Server:

SELECT
  tblSession.PatientID as PID,
  max(tblSession.SessionAttend) - 
    min(tblSession.SessionAttend) + 1 as NumSA,
  max(tblSession.SessionSched) - 
    min(tblSession.SessionSched) + 1 as NumSS FROM
  (
    SELECT top 100 percent
      tblSession.PatientID,
      tblSession.SessionNumber,
      tblSession.SessionDate,
      tblSession.SessionAttend,
      tblSession.SessionSched FROM
      tblPatient INNER JOIN tblSession ON
        tblPatient.PatientID = tblSession.PatientID) WHERE
        (tblSession.SessionDate >= '12/8/2010') AND
        (tblSession.SessionDate <= '5/18/2011') AND
        (tblSession.Status = '2') ORDER BY 
          tblSession.PatientID, tblSession.SessionNumber
  ) GROUP BY tblSession.PatientID
在SQL Server中,它在关键字“GROUP”附近给出了错误的语法。当我将鼠标悬停在GROUP关键字上时,工具提示会在“GROUP”附近显示不正确的语法。预期为、ID或引用的ID。我不明白。有人能告诉我如何进行此查询吗?

中的派生表需要一个别名,其在选择列表中的列引用也相应更新:

SELECT top 100 percent
  ALIASNAME.PatientID as PID,
  max(ALIASNAME.SessionAttend) - 
    min(ALIASNAME.SessionAttend) + 1 as NumSA,
  max(ALIASNAME.SessionSched) - 
    min(ALIASNAME.SessionSched) + 1 as NumSS FROM
  (
    SELECT top 100 percent
      tblSession.PatientID,
      ...
      ...
      ...
      ...
          tblSession.PatientID, tblSession.SessionNumber
  -- This derived table needs an alias
  ) ALIASNAME 
  GROUP BY ALIASNAME.PatientID

您需要来自的子查询的别名。。。我相信你需要一个别名。因此,tblSession.PatientID的最后一个行组需要类似于tblSession.PatientID的tbl组。我可能错了……这是一个无关紧要的问题,但为什么你会有100%的排名?我见过100%排名靠前的人在视图中添加订单。这里似乎没有必要…@dotjoe在视图中也似乎没有必要,因为SQL Server不一定要遵守ORDER BY-ORDER BY仅允许与TOP组合,并指示要包括哪些行,而不是显示它们的顺序。这是一个在2000年起作用的老把戏,但在今天的优化器中不起作用——至少在默认情况下不起作用——在本例中,今天的优化器实际上只是丢弃了TOP和orderby。根据该视图保证ORDER BY的唯一方法是在外部查询上应用ORDER BY。他还需要更新他的字段别名,因为我猜tblsession无法解析。