Sql 上的单词附近出现语法错误

Sql 上的单词附近出现语法错误,sql,sql-server,Sql,Sql Server,我经常在单词ON附近发现一个不正确的语法,这段代码来自上一篇文章的一个建议更改,我正试图找到错误所在,到目前为止,我还没有找到我缺少的标点符号。代码是 SELECT AC.REG_NR, AC.DIS_NR, AC.GEMSID, AC.TMS_ID, AC.EMP_NA, AC.EMP_SEX_TYP_CD, AC.EMP_EOC_GRP_TYP_CD, AC.DIV_NR, AC.CTR_NR, AC.JOB_CLS_CD_DSC_TE, AC.JOB_GRP_CD,

我经常在单词ON附近发现一个不正确的语法,这段代码来自上一篇文章的一个建议更改,我正试图找到错误所在,到目前为止,我还没有找到我缺少的标点符号。代码是

SELECT AC.REG_NR, AC.DIS_NR, AC.GEMSID, AC.TMS_ID, AC.EMP_NA, AC.EMP_SEX_TYP_CD, AC.EMP_EOC_GRP_TYP_CD, AC.DIV_NR, AC.CTR_NR, 
           AC.JOB_CLS_CD_DSC_TE, AC.JOB_GRP_CD, AC.Job_Function, AC.Job_Group, AC.Meeting_Readiness_Rating, AC.Manager_Readiness_Rating, CD.Employee_ID, 
           CD.Meeting_Readiness_Rating AS Expr1, CD.Manager_Readiness_Rating AS Expr2, CD.Meeting_End_Date, CD.EmployeeFeedback, 
           CD.DevelopmentForEmployee1, CD.DevelopmentForEmployee2, CD.DevelopmentForEmployee3, CD.DevelopmentForEmployee4, CD.DevelopmentForEmployee5, 
           CD.Justification, CD.Changed, CD.Notes
FROM  dbo.AC_Source AS AC INNER JOIN
(SELECT EmployeeID AS Employee_ID, MeetingReadinessLevel AS Meeting_Readiness_Rating, ManagerReadinessLevel AS Manager_Readiness_Rating, 
                               logdate AS Meeting_End_Date, EmployeeFeedback, DevelopmentForEmployee1, DevelopmentForEmployee2, DevelopmentForEmployee3, 
                               DevelopmentForEmployee4, DevelopmentForEmployee5, Justification, Changed, Notes
FROM (SELECT EmployeeID AS Employee_ID, MeetingReadinessLevel AS Meeting_Readiness_Rating, ManagerReadinessLevel AS Manager_Readiness_Rating, 
                               logdate AS Meeting_End_Date, EmployeeFeedback, DevelopmentForEmployee1, DevelopmentForEmployee2, DevelopmentForEmployee3, 
                               DevelopmentForEmployee4, DevelopmentForEmployee5, Justification, Changed, Notes, ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY Meeting_End_Date DESC) As RowNum
FROM (SELECT EmployeeID AS Employee_ID, MeetingReadinessLevel AS Meeting_Readiness_Rating, ManagerReadinessLevel AS Manager_Readiness_Rating, 
                               logdate AS Meeting_End_Date, EmployeeFeedback, DevelopmentForEmployee1, DevelopmentForEmployee2, DevelopmentForEmployee3, 
                               DevelopmentForEmployee4, DevelopmentForEmployee5, Justification, Changed, Notes
                FROM   dbo.AC_CDData_1
                UNION ALL
                SELECT Employee_ID, Meeting_Readiness_Rating, Manager_Readiness_Rating, Meeting_End_Date, '' AS EmployeeFeedback, '' AS DevelopmentForEmployee1, 
                               '' AS DevelopmentForEmployee2, '' AS DevelopmentForEmployee3, '' AS DevelopmentForEmployee4, '' AS DevelopmentForEmployee5, '' AS Justification, 
                               '' AS Changed, '' AS Notes
                FROM  dbo.TMS_Data_Latest_Career_Meeting_Rating
                WHERE (Plan_Year = '2013')) AS InnerSelect) AS CD ON AC.TMS_ID = CD.Employee_ID
WHERE RowNum = 1)
ON AC.TMS_ID = CD.EMPLOYEE_ID;

首先,所有子查询都需要别名。因此,给子查询一个名称。我认为是这样的:

SELECT AC.REG_NR, AC.DIS_NR, AC.GEMSID, AC.TMS_ID, AC.EMP_NA, AC.EMP_SEX_TYP_CD,
       AC.EMP_EOC_GRP_TYP_CD, AC.DIV_NR, AC.CTR_NR, 
       AC.JOB_CLS_CD_DSC_TE, AC.JOB_GRP_CD, AC.Job_Function, AC.Job_Group,
       AC.Meeting_Readiness_Rating, AC.Manager_Readiness_Rating, CD.Employee_ID, 
       CD.Meeting_Readiness_Rating AS Expr1, CD.Manager_Readiness_Rating AS Expr2, 
       CD.Meeting_End_Date, CD.EmployeeFeedback, 
       CD.DevelopmentForEmployee1, CD.DevelopmentForEmployee2, CD.DevelopmentForEmployee3, 
       CD.DevelopmentForEmployee4, CD.DevelopmentForEmployee5, 
       CD.Justification, CD.Changed, CD.Notes
FROM  dbo.AC_Source AS AC INNER JOIN
       (SELECT EmployeeID AS Employee_ID, MeetingReadinessLevel AS Meeting_Readiness_Rating, ManagerReadinessLevel AS Manager_Readiness_Rating, 
                               logdate AS Meeting_End_Date, EmployeeFeedback, DevelopmentForEmployee1, DevelopmentForEmployee2, DevelopmentForEmployee3, 
                               DevelopmentForEmployee4, DevelopmentForEmployee5, Justification, Changed, Notes
FROM (SELECT EmployeeID AS Employee_ID, MeetingReadinessLevel AS Meeting_Readiness_Rating,
             ManagerReadinessLevel AS Manager_Readiness_Rating, 
             logdate AS Meeting_End_Date, EmployeeFeedback, DevelopmentForEmployee1, 
             DevelopmentForEmployee2, DevelopmentForEmployee3, 
             DevelopmentForEmployee4, DevelopmentForEmployee5, Justification, Changed, 
             Notes,
             ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY Meeting_End_Date DESC) As RowNum
      FROM (SELECT EmployeeID AS Employee_ID, MeetingReadinessLevel AS Meeting_Readiness_Rating, ManagerReadinessLevel AS Manager_Readiness_Rating, 
                               logdate AS Meeting_End_Date, EmployeeFeedback, DevelopmentForEmployee1, DevelopmentForEmployee2, DevelopmentForEmployee3, 
                               DevelopmentForEmployee4, DevelopmentForEmployee5, Justification, Changed, Notes
            FROM   dbo.AC_CDData_1
            UNION ALL
            SELECT Employee_ID, Meeting_Readiness_Rating, Manager_Readiness_Rating, Meeting_End_Date, '' AS EmployeeFeedback, '' AS DevelopmentForEmployee1, 
                               '' AS DevelopmentForEmployee2, '' AS DevelopmentForEmployee3, '' AS DevelopmentForEmployee4, '' AS DevelopmentForEmployee5, '' AS Justification, 
                               '' AS Changed, '' AS Notes
            FROM  dbo.TMS_Data_Latest_Career_Meeting_Rating
            WHERE (Plan_Year = '2013')) AS InnerSelect
          ) cd
     ) cd
     ON AC.TMS_ID = CD.EMPLOYEE_ID and rownum = 1

这就是您的查询应该是什么样子。如果您使用CTE,它很容易阅读,也很容易发现错误

关于CTE的文件


此查询有问题(好的,没有新内容..)。最后一个子查询上没有别名,但似乎还有更多别名

简化且适当缩进的表单可能有助于您发现问题:

SELECT x
FROM  dbo.AC_Source AS AC 
INNER JOIN (
    SELECT x
    FROM (
        SELECT x, ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY Meeting_End_Date DESC) As RowNum
        FROM (
            SELECT x
            FROM   dbo.AC_CDData_1
            UNION ALL
            SELECT x
            FROM  dbo.TMS_Data_Latest_Career_Meeting_Rating
            WHERE Plan_Year = '2013'
        ) AS InnerSelect
    ) AS CD ON AC.TMS_ID = CD.Employee_ID
    WHERE RowNum = 1
) ON AC.TMS_ID = CD.EMPLOYEE_ID;

其中RowNum=1)在AC.TMS_ID=CD.EMPLOYEE_ID上
关闭后,子查询的别名似乎丢失了
。这对我来说太密集了,无法在不进行分析的情况下直观地确定应该是哪个别名(
AC
,或
CD
),但您可能正在寻找
,其中RowNum=1)作为AC.TMS_ID=CD.EMPLOYEE_ID上的CD我试过了,但仍然得到了errorLearn CTE(公共表表达式)。如果这样做也不会有问题。这也不起作用,它会给我所有字段的错误
SELECT x
FROM  dbo.AC_Source AS AC 
INNER JOIN (
    SELECT x
    FROM (
        SELECT x, ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY Meeting_End_Date DESC) As RowNum
        FROM (
            SELECT x
            FROM   dbo.AC_CDData_1
            UNION ALL
            SELECT x
            FROM  dbo.TMS_Data_Latest_Career_Meeting_Rating
            WHERE Plan_Year = '2013'
        ) AS InnerSelect
    ) AS CD ON AC.TMS_ID = CD.Employee_ID
    WHERE RowNum = 1
) ON AC.TMS_ID = CD.EMPLOYEE_ID;