2013-02-12 110 views
0

我收到以下查询错误。我不完全确定为什么。问题与查询连接

下面的查询是动态SQL,它被设置成变量和打印出来。

错误消息:

消息156,级别15,状态1,行 'AS' 关键字近60 语法不正确。 Msg 156,Level 15,State 1,Line 77 关键字'AS'附近的语法不正确。 Msg 156,Level 15,State 1,Line 86 关键字'AS'附近的语法不正确。

查询:

SELECT * FROM(SELECT * FROM (
     SELECT vwGetMySDDocsLatest.Document_ID, 
       vwGetMySDDocsLatest.ViewPrintFlag AS ViewPrint, 
       vwGetMySDDocsLatest.ViewOnly, 
       vwGetMySDDocsLatest.DownloadFlag AS Download, 
       vwGetMySDDocsLatest.DocBookFlag AS DocBook, 
       vwGetMySDDocsLatest.Name_ID, 
       vwGetMySDDocsLatest.SheetNo, 
       vwGetMySDDocsLatest.SheetNoTotal, 
       vwGetMySDDocsLatest.Title, 
       vwGetMySDDocsLatest.Rev, 
       vwGetMySDDocsLatest.Rev_Date, 
       vwGetMySDDocsLatest.Rev_Purpose_Code, 
       vwGetMySDDocsLatest.[Filename], 
       vwGetMySDDocsLatest.Extension, 
       vwGetMySDDocsLatest.DocumentNo, 
       vwGetMySDDocsLatest.ClientDocument_No, 
       vwGetMySDDocsLatest.DEL_DOCSTRING, 
       vwGetMySDDocsLatest.RE_Init, 
       vwGetMySDDocsLatest.Project_ID 

      , 1 AS NumberOfRows , 1 AS NumberOfPages 
     ,ROW_NUMBER() OVER(ORDER BY DocumentNo) As RN 
     FROM vwGetMySDDocsLatest INNER JOIN (SELECT DISTINCT tblSDDocuments_REV.Document_ID FROM tblSDDocuments_REV WHERE 1 = 1 ) AS DR2 ON vwGetMySDDocsLatest.Document_ID = DR2.Document_ID 
     WHERE vwGetMySDDocsLatest.Name_ID = 4362 AND 
     vwGetMySDDocsLatest.Project_ID = 349 AND 
     vwGetMySDDocsLatest.DocumentNo Like '%lp-0887-p01%' 
     ) AS newTBL 
       WHERE newTBL.RN BETWEEN 1 AND 25) AS onePage 
     INNER JOIN (SELECT tblSDDocuments_Rev.DocumentRev_ID AS R_DocumentRev_ID , 
         tblSDDocuments_Rev.Document_ID AS R_Document_ID, 
         tblSDDocuments_Rev.Rev AS R_Rev, 
         tblSDDocuments_Rev.Rev_Create_Date AS R_Rev_Create_Date, 
         tblSDDocuments_Rev.Rev_Due_Date AS R_Rev_Due_Date, 
         dbo.udfNameForward(tblSDDocuments_Rev.Rev_Due_From) AS R_NameFrom, 
         tblSDDocuments_Rev.Rev_Date AS R_Rev_Date, 
         dbo.tblRev_Purpose.Rev_Purpose_Code AS R_Rev_Purpose_Code, 
         tblSDDocuments_Rev.Flag AS R_Flag, 
         tblSDDocuments_Rev.Filename AS R_Filename, 
         tblFileExtensions.Extension AS R_Extension, 
         tblSDDocuments_Rev.Client_Filename AS R_Client_Filename, 
         dbo.tblRev_Purpose.Allow_Matrix_View AS R_Allow_Matrix_View, 
         tblSDDocuments_Rev.Filename_Available AS R_Filename_Available, 
         tblSDDocuments_Rev.Filename_Available_Other AS R_Filename_Available_Other, 
         tblRev_Purpose.Rev_Purpose_ID AS R_Rev_Purpose_ID 

         FROM tblSDDocuments_Rev 
         LEFT OUTER JOIN tblFileExtensions 
         ON tblSDDocuments_Rev.Extension_id = tblFileExtensions.Extension_ID 
         LEFT OUTER JOIN tbl_Name 
         ON tblSDDocuments_Rev.Rev_Due_From = tbl_Name.Name_Id 
         LEFT OUTER JOIN dbo.tblRev_Purpose 
         ON tblSDDocuments_Rev.Rev_Purpose_ID = dbo.tblRev_Purpose.Rev_Purpose_ID WHERE 1 = 1 ) AS TBLRevs 

        ON onePage.Document_ID = TBLRevs.R_Document_ID 
        INNER JOIN (SELECT Document_ID AS MDID, MAX(DocumentREV_ID) AS MAXREV 
           FROM tblSDDocuments_REV 
           --WHERE REV_Date IS NOT NULL 
           GROUP BY Document_ID) AS MAXTBL 
        ON MAXTBL.MDID = TBLRevs.R_Document_ID 

        INNER JOIN ((SELECT Document_ID AS MDID2, MAX(REV_DATE) AS MAXREVDATE 
           FROM tblSDDocuments_REV 
           GROUP BY Document_ID) AS MAX1 
          INNER JOIN tblSDDocuments_REV R1 
           ON MAX1.MAXREVDATE = R1.Rev_Date AND MAX1.MDID2 = R1.Document_ID) AS MAXDATETBL 
        ON MAXDATETBL.MDID2 = TBLRevs.R_Document_ID 


        LEFT OUTER JOIN(SELECT DISTINCT td.document_Rev_ID, a.Approval_Abbr 
            FROM tblsdtransmittal_documents td 
             inner join tblsdtransmittal t 
              on td.transmittal_id = t.transmittal_id 
             inner join tblDocuments_ApprovalType a 
              ON td.Approval_ID = a.Approval_ID 
             inner join (
              SELECT MAX(t.created_date) AS LatestDate, td.Document_Rev_ID 
              FROM tblsdtransmittal t 
               INNER JOIN tblsdtransmittal_documents td 
                ON t.transmittal_id = td.transmittal_id 
              WHERE t.to_supplier = 1 
              GROUP by td.Document_Rev_ID) MAXDATE 
             ON td.document_Rev_ID = maxdate.document_Rev_ID AND t.created_date = MAXDATE.LatestDate) AS APPRTBL 
        ON tblrevs.r_documentrev_id = APPRTBL.document_Rev_ID 


        LEFT OUTER JOIN(SELECT SDRevComments_ID AS ETRevComments_ID, 
          SDRevComments_RevID AS ETRevComments_RevID, 
          SDRevComments_New_Filename AS ETRevComments_New_Filename, 
          SDRevComments_Orig_Filename AS ETRevComments_Orig_Filename, 
          SDRevComments_Description AS ETRevComments_Description 
        FROM tblSDDocuments_Rev_Comments) AS COMTBL 
        ON TBLRevs.R_DocumentREV_ID = COMTBL.ETRevComments_RevID 
        WHERE MAXTBL.MAXREV = TBLRevs.R_DocumentRev_ID ---check for latest/all revs 

        ORDER BY DocumentNo ,TBLRevs.R_Document_ID, TBLRevs.R_DocumentRev_ID DESC 

如果我删除查询的这个部分:

   INNER JOIN ((SELECT Document_ID AS MDID2, MAX(REV_DATE) AS MAXREVDATE 
         FROM tblSDDocuments_REV 
         GROUP BY Document_ID) AS MAX1 
        INNER JOIN tblSDDocuments_REV R1 
         ON MAX1.MAXREVDATE = R1.Rev_Date AND MAX1.MDID2 = R1.Document_ID) AS MAXDATETBL 
      ON MAXDATETBL.MDID2 = TBLRevs.R_Document_ID 

它运行伟大。任何想法我在这里做错了吗?

回答

0

你有一个额外的支架(INNER JOIN刚过,失去它,并尝试

INNER JOIN 
    (SELECT Document_ID AS MDID2, MAX(REV_DATE) AS MAXREVDATE 
    FROM tblSDDocuments_REV 
    GROUP BY Document_ID) AS MAX1 
    INNER JOIN tblSDDocuments_REV R1 ON MAX1.MAXREVDATE = R1.Rev_Date AND MAX1.MDID2 = R1.Document_ID) AS MAXDATETBL 
ON MAXDATETBL.MDID2 = TBLRevs.R_Document_ID 
+0

为查询的该部分找到括号。 select语句前有2个左括号。相应的右括号在Group By ...之后)和内连接的最后一部分之后。如果我按照上面的建议删除一个,则查询有不同的问题。 – 2013-02-13 13:33:35

+0

第一个括号后,你必须选择一些列,只有内部连接没有列选择。 – 2013-02-13 14:43:27

0

问题这个片段:

INNER JOIN ((SELECT Document_ID AS MDID2, MAX(REV_DATE) AS MAXREVDATE 
      FROM tblSDDocuments_REV 
      GROUP BY Document_ID) AS MAX1 
     INNER JOIN tblSDDocuments_REV R1 
      ON MAX1.MAXREVDATE = R1.Rev_Date AND MAX1.MDID2 = R1.Document_ID) AS MAXDATETBL 
ON MAXDATETBL.MDID2 = TBLRevs.R_Document_ID 

的问题是分配的别名(MAXDATETBL )到一个连接的结果显然SQL Server不喜欢这样,实际上你不需要这个别名该内部内部连接的结果集中的列应该使用所贡献表的别名来引用加入。也就是说,代替MAXDATETBL.MDID2您应该指定MAX1.MDID2

INNER JOIN ((SELECT Document_ID AS MDID2, MAX(REV_DATE) AS MAXREVDATE 
      FROM tblSDDocuments_REV 
      GROUP BY Document_ID) AS MAX1 
     INNER JOIN tblSDDocuments_REV R1 
      ON MAX1.MAXREVDATE = R1.Rev_Date AND MAX1.MDID2 = R1.Document_ID) AS MAXDATETBL 
ON MAX1.MDID2 = TBLRevs.R_Document_ID 

你甚至可以忽略周围的内部支架加入。他们被允许的,但都是多余的,因为语法清楚地表明,内右侧JOIN在片段的开头其实MAX1R1,而不是单独与一个MAX加入。