【问题标题】:SQL - Outer Apply does not work in SQL Server 2000?SQL - 外部应用在 SQL Server 2000 中不起作用?
【发布时间】:2019-07-12 12:58:22
【问题描述】:

我之前在我公司的测试服务器中进行了测试,以创建新的视图设计

SELECT     
    a.[CourseID], a.[Course Code], a.[Course Title] AS [Course Description], 
    a.[Result], a.[Employee No], a.[Employee Name], a.[Section], 
    CONVERT(VARCHAR, b.ActStartDate, 105) AS [Last Training Date], 
    CONVERT(VARCHAR, b.ValidTo, 105) AS [Validity Period], 
    a.[Status], a.[Flag]
FROM
    (SELECT     
         c.CourseID, c.CourseCode AS [Course Code], c.CourseTitle AS [Course Title], 
         c.CourseCode + ' - ' + c.CourseTitle AS Result, 
         b.EMPLOYEE_NO AS [Employee No], b.EMPLOYEE_NAME AS [Employee Name], 
         b.SECTION_CODE + ' - ' + b.SECTION_DESCRIPTION AS Section, 
         b.EMPLOYEE_STATUS AS Status, a.Flag
     FROM         
         dbo.ZOJT_EMP_COURSE AS a 
     INNER JOIN
         dbo.vEMPLOYEE_PROFILE AS b ON a.Employee_No = b.EMPLOYEE_NO 
     INNER JOIN
         dbo.tTMS_Course AS c ON c.CourseCode = a.CourseCode) A 
OUTER APPLY
    (SELECT TOP 1 *
     FROM
         (SELECT     
              b.CourseID, a.EmpNo, b.ActStartDate, a.ValidTo
          FROM         
              dbo.tTMS_Training_Record AS a 
          INNER JOIN
              (SELECT     
                   SchID, CourseID, MAX(ActStartDate) AS ActStartDate
               FROM          
                   dbo.tTMS_Training_Schedule AS z
               GROUP BY 
                   SchID, CourseID) AS b ON a.SchID = b.SchID) AS y
    WHERE 
        ActStartDate IS NOT NULL 
        AND CourseID = A.CourseID 
        AND EmpNo = A.[Employee No]
    ORDER BY 
        ActStartDate DESC, ValidTo DESC) B

但是,当我尝试在实时环境中移动此查询时,出现 2 个不正确的语法错误。

一个靠近Outer Apply,另一个靠近Order By ActStartDate。当我问到这个问题时,我的前辈认为这可能是因为我用来测试这个的测试服务器是SQL Server 2008,而实时服务器是SQL Server 2000。

现在的问题是,真的是这样吗?如果是,是否有解决方法?请注意,我没有办法或没有权限升级我的实时服务器。

【问题讨论】:

标签: sql sql-server sql-server-2000


【解决方案1】:

对于在您的内部查询中使用的 order by,请在查询中使用前 100%。

  GO
  select col1, col2 from 
  ( select top 100 percent col1, col2,
  ... from yourtable) as DC
  GO

【讨论】:

    【解决方案2】:

    您收到错误是因为 SQL Server 允许从 SQL Server 2005 到更高版本的 APPLY 运算符。要使用 APPLY,数据库兼容级别必须至少为 90,从 2005 年到以后可用。您必须使用子查询替换outer apply

        SELECT 
    
            a.[CourseID], a.[Course Code], a.[Course Title] AS [Course Description], a.[Result], a.[Employee No], a.[Employee Name], a.[Section], CONVERT(varchar, b.ActStartDate, 
                          105) AS [Last Training Date], CONVERT(varchar, b.ValidTo, 105) AS [Validity Period], a.[Status], a.[Flag]
        FROM         (SELECT     c.CourseID, c.CourseCode AS [Course Code], c.CourseTitle AS [Course Title], c.CourseCode + ' - ' + c.CourseTitle AS Result, b.EMPLOYEE_NO AS [Employee No], 
                          b.EMPLOYEE_NAME AS [Employee Name], b.SECTION_CODE + ' - ' + b.SECTION_DESCRIPTION AS Section, b.EMPLOYEE_STATUS AS Status, a.Flag
        FROM         dbo.ZOJT_EMP_COURSE AS a INNER JOIN
                          dbo.vEMPLOYEE_PROFILE AS b ON a.Employee_No = b.EMPLOYEE_NO INNER JOIN
                          dbo.tTMS_Course AS c ON c.CourseCode = a.CourseCode) 
        A left join
                              (SELECT  max(ActStartDate) as ActStartDate,
      max(ValidTo) as ValidTo,CourseID,EmpNo
                                FROM          (SELECT     b.CourseID, a.EmpNo, b.ActStartDate, a.ValidTo
                                                FROM         dbo.tTMS_Training_Record AS a INNER JOIN
                                                (SELECT     SchID, CourseID, MAX(ActStartDate) AS ActStartDate
                                                FROM          dbo.tTMS_Training_Schedule AS z
                                                GROUP BY SchID, CourseID) AS b ON a.SchID = b.SchID) as y
    
                                WHERE ActStartDate IS NOT NULL 
                               --AND CourseID = A.CourseID AND EmpNo = A.[Employee No]
                                --ORDER BY ActStartDate DESC, ValidTo DESC
                             group by CourseID,EmpNo
                             ) B 
                             on a.courseid = b.courseid and a.[employee no] = b.empno
    

    【讨论】:

    • 您忘记在查询后面添加此项。 on a.courseid = b.courseid and a.[employee no] = b.empno 否则我会得到不正确的语法。除此之外,它工作得很好。谢谢。
    猜你喜欢
    • 2014-07-03
    • 2011-05-10
    • 2011-12-23
    • 2013-12-11
    • 2016-11-16
    • 2020-06-22
    • 1970-01-01
    • 2015-11-28
    • 2019-04-04
    相关资源
    最近更新 更多