【问题标题】:how to figure out syntax error?如何找出语法错误?
【发布时间】:2013-12-20 16:11:29
【问题描述】:

我正在尝试编写一个不断给我语法错误的 SQL 查询。问题是,错误消息根本没有帮助我。

这是查询:

SELECT * 
FROM
   (SELECT     
        dbo.ciqCompanyUltimateParent.ultimateParentCompanyId, 
        COUNT(DISTINCT dbo.ciqCompany.companyId) AS Subsidiaries_Count, 
        COUNT(DISTINCT dbo.ciqCountryGeo.countryId) AS Countries_Count
    FROM         
        dbo.ciqCompanyUltimateParent 
    INNER JOIN
        dbo.ciqCompany ON dbo.ciqCompanyUltimateParent.companyId = dbo.ciqCompany.companyId  
    INNER JOIN
        dbo.ciqCountryGeo ON dbo.ciqCompany.countryId = dbo.ciqCountryGeo.countryId
    GROUP BY 
        dbo.ciqCompanyUltimateParent.ultimateParentCompanyId
     )
INNER JOIN 
    dbo.ciqCompany ON ultimateParentCompanyId = dbo.ciqCompany.companyId 

当我执行它时,括号中的东西可以正常工作(即它执行并返回一个表)。但是,最后一个 INNER JOIN 给了我以下错误:

消息 156,第 15 级,状态 1,第 10 行
关键字“INNER”附近的语法不正确。

更糟糕的是,当我将上面的语句缩减为

SELECT * 
FROM
    (SELECT     
        dbo.ciqCompanyUltimateParent.ultimateParentCompanyId, 
        COUNT(DISTINCT dbo.ciqCompany.companyId) AS Subsidiaries_Count, 
        COUNT(DISTINCT dbo.ciqCountryGeo.countryId) AS Countries_Count
     FROM         
        dbo.ciqCompanyUltimateParent 
     INNER JOIN
        dbo.ciqCompany ON dbo.ciqCompanyUltimateParent.companyId = dbo.ciqCompany.companyId 
     INNER JOIN
        dbo.ciqCountryGeo ON dbo.ciqCompany.countryId = dbo.ciqCountryGeo.countryId
     GROUP BY 
        dbo.ciqCompanyUltimateParent.ultimateParentCompanyId
    )

我收到类似的错误 -

消息 102,第 15 级,状态 1,第 9 行
')' 附近的语法不正确。

为什么我不能从运行良好的查询中选择 *?

【问题讨论】:

  • Incorrect syntax near INNER 是由于子查询中缺少别名。您必须为 FROM 子句中的第一个子查询赋予它自己的别名。
  • 您必须使用别名来命名子查询。
  • 仅供参考,“SQL”不是数据库产品的名称。

标签: sql sql-server


【解决方案1】:

尝试为您的子查询设置别名。例如

SELECT * FROM
(
 ....
) SUB
INNER JOIN dbo.ciqCompany 
ON SUB.ultimateParentCompanyId = dbo.ciqCompany.companyId 

【讨论】:

  • 谢谢,这行得通。为什么我需要这样做?
  • @Anne 在这个你的子查询中充当派生表,并且必须有一个名称
  • 谢谢!那么 SUB 是这个表的名称吗?
  • @Anne 没错,它是派生表的别名,因此加入ON SUB.ultimateParentCompanyId
【解决方案2】:

鉴于dbo,您使用的是 MS SQL Server?您需要在括号中嵌入多个连接:

SELECT ..
FROM table1
JOIN (table2 ON ...
    JOIN (table3 ON ...
        JOIN table4 ON ...
            etc...
    )
)

【讨论】:

  • 是的,我在 MS SQL Server 上。但是,为什么我需要放括号?没有括号,内部钻头工作正常。
  • Access 需要,但 SQL Server 不需要 IIRC。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 2017-10-06
相关资源
最近更新 更多