【问题标题】:What is the wrong with the sql syntaxsql语法有什么问题
【发布时间】:2016-04-11 13:07:30
【问题描述】:
SELECT 
    a.Name, a.About, 
    COUNT(b.Id) AS TotalCities, 
    SUM(b.NoOfDwellers) AS TotalCityDwellers 
FROM 
    Countries a 
LEFT JOIN 
    Cities b ON a.Id = b.CountryId 
WHERE 
    a.Name LIKE '%some str%'  
GROUP BY 
    a.Id 
ORDER BY 
    a.Name ASC

此 SQL 返回错误:

消息 8120,第 16 级,状态 1,第 1 行
列“Countries.Name”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

【问题讨论】:

  • 如果你有一个SELECT 有一个GROUP BY 子句,那么SELECT 列表中的每个 列必须是either 一个聚合(SUMCOUNTMAX 等),或者它必须在 GROUP BY 子句中。您的SELECT 列表中有a.Namea.About,它们 由聚合处理 - 因此,这两列 必须 出现在GROUP BY 子句中
  • 确切的错误信息是:Countries.Name 不包含在GROUP BY 子句中。
  • 不知道您的数据,这可能就像在SELECT 子句中将a.Name 替换为MAX(a.Name) 一样简单。
  • 但是在mysql中是可以的。那么如何使用 sql server 2012 实现这个查询结果。@marc_s & @TT
  • @Chayan - 这是一个documented extension in MySQL 和一个不太好的(IMO)。

标签: sql sql-server select sql-server-2012 syntax-error


【解决方案1】:

如果您有一个带有GROUP BY 子句的SELECT,则SELECT 列列表中的每一列都必须是任一 聚合(SUMCOUNT、@987654326 @ 等),或者它必须在 GROUP BY 子句中。

SELECT 列表中的 a.Namea.About 均未由聚合处理 - 因此,这两列必须出现在 GROUP BY 子句中

SELECT 
    a.Name, a.About, 
    COUNT(b.Id) AS TotalCities, 
    SUM(b.NoOfDwellers) AS TotalCityDwellers 
FROM 
    Countries a 
LEFT JOIN 
    Cities b ON a.Id = b.CountryId 
WHERE 
    a.Name LIKE '%some str%'  
GROUP BY 
    a.Id, a.About, a.Name 
ORDER BY 
    a.Name ASC

【讨论】:

  • 现在显示:Msg 306, Level 16, State 2, Line 12 The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.
  • @Chayan: TEXTNTEXTIMAGE弃用不应永远使用 - 使用 (N)VARCHAR(MAX)VARBINARY(MAX) 代替,或者使用适当大小的 (N)VARCHAR(n) 而不是只使用 VARCHAR(MAX) 来处理所有内容。 ...
  • 谢谢。几分钟后我会接受这个答案。
【解决方案2】:

在包含group by 子句的查询中,结果中的每一行都代表整个行组,这些行与它们分组的列的值相同。因此,您选择的每个项目都必须是这些列之一、对它们的基于行的操作或聚合函数。您似乎正在尝试根据anameabout 聚合b 的值。如果这是真的,您应该相应地修改您的group by 子句:

SELECT 
    a.Name, a.About, 
    COUNT(b.Id) AS TotalCities, 
    SUM(b.NoOfDwellers) AS TotalCityDwellers 
FROM 
    Countries a 
LEFT JOIN 
    Cities b ON a.Id = b.CountryId 
WHERE 
    a.Name IS NULL 
GROUP BY 
    a.Name, a.About -- here!
ORDER BY 
    a.Name ASC

【讨论】:

  • 感谢您的帮助。 (+1)
猜你喜欢
  • 2015-11-30
  • 1970-01-01
  • 2011-02-20
  • 2012-07-07
  • 2012-05-02
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
相关资源
最近更新 更多