多语言查询连接的SQL语法错误

时间:2016-04-01 10:44:46

标签: sql sql-server

请帮忙!

我的部分查询出现语法错误,无法弄清楚错误。 Intellisense不会对我使用的数据库起作用。我试图用括号括起子查询,但这仍然会引发语法错误。有人能发现问题吗?我认为它是一个缺失的括号或其他东西,但我无法找到任何子查询的语法。

请注意,我尝试做的是将现有的MS Access报告转换为SQL,由于相互嵌入大量的查询来生成数据,因此证明非常困难。任何与“Qry”相关的事情都是' qry'是对Access中某些内容的引用。此查询针对用于跟踪员工进出门的数据库,并用于出勤报告。不幸的是,因为它不是内部系统,所以我无法访问数据库模式,因此我很难自己构建查询。我可以发布完整的东西但没有上下文它可能没有多大意义?现在我将发布部分查询。

我得到的错误:

>Msg 156, Level 15, State 1, Line 21
>Incorrect syntax near the keyword 'RIGHT'.
>Msg 156, Level 15, State 1, Line 27
>Incorrect syntax near the keyword 'RIGHT'.
>Msg 156, Level 15, State 1, Line 34
>Incorrect syntax near the keyword 'ON'.

下面的SQL查询的一部分。请注意,第21行是第一个' RIGHT JOIN'是。

INNER JOIN (
    SELECT vw_ReportQuery.UserID
        ,vw_ReportQuery.[6000UserName]
        ,vw_ReportQuery.[6007EventTime]
        ,CAST([6007EventTime] AS DATETIME) AS SDate
        ,DatePart(HOUR, [6007EventTIme]) AS hoursBetween
        ,vw_ReportQuery.[6002DoorName]
    FROM vw_ReportQuery
    WHERE (
            ((vw_ReportQuery.[6000UserName]) = 'Smith, Jon')
            AND (
                (vw_ReportQuery.[6007EventTime]) >= '1/1/2016 00:00:00'
                AND (vw_ReportQuery.[6007EventTime]) <= '1/30/2016 00:00:00'
                )
            AND (
                (DatePart(Hour, [6007EventTIme])) BETWEEN 12
                    AND 14
                )
            AND (
                (vw_ReportQuery.[6002DoorName]) LIKE 'Gnd floor Rear Goods Door (out)'
                OR (vw_ReportQuery.[6002DoorName]) LIKE 'Gnd flr Staff Entrance (out)'
                OR (vw_ReportQuery.[6002DoorName]) LIKE 'Gnd flr Sub-let entrance (out)'
                OR (
                    (vw_ReportQuery.[6002DoorName]) LIKE 'Gnd floor Rear Goods Door (in)'
                    OR (vw_ReportQuery.[6002DoorName]) LIKE 'Gnd flr Staff Entrance (in)'
                    OR (vw_ReportQuery.[6002DoorName]) LIKE 'Gnd flr Sub-let entrance (in)'
                    )
                )
            )
    ) AS qryTestSelectedLunchPeriodHas_1 ON qryTestSelectedLunchPeriodHas.SDate = qryTestSelectedLunchPeriodHas_1.SDate
GROUP BY qryTestSelectedLunchPeriodHas.UserID
    ,qryTestSelectedLunchPeriodHas.[6000UserName]
    ,qryTestSelectedLunchPeriodHas.SDate ) -- as qryTestLunchPeriodHasFinal 
RIGHT JOIN (
    SELECT vw_ReportQuery.UserID
        ,vw_ReportQuery.[6000UserName]
        ,vw_ReportQuery.[6007EventTime]
        ,Cast([6007EventTime] AS DATETIME) AS SDate
    FROM vw_ReportQuery
    WHERE (
            ((vw_ReportQuery.[6000UserName]) = 'Smith, Jon')
            AND (
                (vw_ReportQuery.[6007EventTime]) >= '1/1/2016 00:00:00'
                AND (vw_ReportQuery.[6007EventTime]) <= '1/30/2016 00:00:00'
                )
            )
    RIGHT JOIN (
        SELECT vw_ReportQuery.UserID
            ,vw_ReportQuery.[6000UserName]
            ,vw_ReportQuery.[6007EventTime]
            ,Cast([6007EventTime] AS DATETIME) AS SDate
        FROM vw_ReportQuery
        WHERE (
                ((vw_ReportQuery.[6000UserName]) = 'Smith, Jon')
                AND (
                    (vw_ReportQuery.[6007EventTime]) >= '1/1/2016 00:00:00'
                    AND (vw_ReportQuery.[6007EventTime]) <= '1/30/2016 00:00:00'
                    )
                )
        ) ON qrySelectedDatesAndUser.SDate = qrySelectedDatesAndUser_1.SDate
    ) ON qryTestLunchPeriodHasFinal.SDate = qrySelectedDatesAndUser.SDate
GROUP BY qrySelectedDatesAndUser.[6000UserName]
    ,qrySelectedDatesAndUser_1.SDate
    ,qryTestLunchPeriodHasFinal.First
    ,qryTestLunchPeriodHasFinal.Last
    ,qryTestLunchPeriodHasFinal.LunchPeriod

1 个答案:

答案 0 :(得分:1)

您已将子查询别名注释掉:-- as qryTestLunchPeriodHasFinal。而你的其他子查询也需要别名。我敢打赌那是你的问题。

此外,而不是

OR (vw_ReportQuery.[6002DoorName]) LIKE 'Gnd flr Staff Entrance (out)'
OR (vw_ReportQuery.[6002DoorName]) LIKE 'Gnd flr Sub-let entrance (out)'
OR ....

你可以简单地做

OR vw_ReportQuery.[6002DoorName] IN ('Gnd flr Staff Entrance (out)', 'Gnd flr Sub-let entrance (out)', {etcetera})