【问题标题】:Can't select columns from database无法从数据库中选择列
【发布时间】:2012-10-03 18:50:18
【问题描述】:

我有 3 张桌子:

  • [Users]: UserId, Name...
  • [Topics]: TopicId, CreatorUserId...
  • [Comments]: CommentId, TopicId...

现在,我想根据这个机制选择最热门话题的创建者: 获取比指定日期更新的 cmets。按主题的创建者对这些 cmets 进行分组,并按组中的行数排序。

但是,我不确定我的查询是否遵循这个逻辑(根据结果似乎,但我只有几个用户和主题),但主要问题是当我要选择的名称时用户 (Users.Name),我收到一个错误:

列“[TestDatabase].[dbo].[Users].[Name]”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

T-SQL 查询:

SELECT 
   Users.UserId, Users.Name, COUNT(Users.UserId) as RowCountInGroup
FROM [TestDatabase].[dbo].[Users]
INNER JOIN [TestDatabase].[dbo].[Topics] ON Topics.CreatorUserId = Users.UserId
INNER JOIN [TestDatabase].[dbo].[Comments] ON Comments.TopicId = Topics.TopicId
WHERE 
   Comments.CreationDate > CAST('14 SEPTEMBER 2012' as DateTime)
GROUP BY Users.UserId
ORDER BY RowCountInGroup DESC

谢谢你帮助我。

编辑:我已经复制了原始错误消息。我需要从 User 中选择 Email、City 等列,所以我不确定将所有这些添加到 group by 子句是最好的解决方案。

【问题讨论】:

  • 错误和 SQL 不匹配 - 您确定错误与 Users.Name 列无关吗?
  • 您还必须对 Users.Name 进行分组,这可以解释您遇到的错误,即使错误文本与您的查询内容不匹配。

标签: sql sql-server-2008


【解决方案1】:

您需要按您选择的两列(或通常:所有列)进行分组(未由 COUNT 聚合运算符聚合):

SELECT 
   Users.UserId, Users.Name, COUNT(Users.UserId) as RowCountInGroup
FROM [TestDatabase].[dbo].[Users]
INNER JOIN [TestDatabase].[dbo].[Topics] ON Topics.CreatorUserId = Users.UserId
INNER JOIN [TestDatabase].[dbo].[Comments] ON Comments.TopicId = Topics.TopicId
WHERE 
   Comments.CreationDate > CAST('14 SEPTEMBER 2012' as DateTime)
GROUP BY 
   Users.UserId, Users.Name   <=== you need to add "Users.Name" here!
ORDER BY RowCountInGroup DESC

【讨论】:

  • 是的,我确实如此,但我至少需要选择五列。 Users.City、Users.Email...这是唯一的方法吗?
  • @laszlokiss88:是的——就是这样做的。这样做的唯一方法。
  • @laszlokiss88 > 是的......走的路
【解决方案2】:

您需要在 group by 子句中同时包含 UserId 和 Name

【讨论】:

    【解决方案3】:

    这是一种方法:

    SELECT a.UserId, b.Name, a.RowCountInGroup
    FROM
        (SELECT Users.UserId, COUNT(Users.UserId) as RowCountInGroup
        FROM [TestDatabase].[dbo].[Users]
        INNER JOIN [TestDatabase].[dbo].[Topics] 
        ON Topics.CreatorUserId = Users.UserId
        INNER JOIN [TestDatabase].[dbo].[Comments] ON
        Comments.TopicId = Topics.TopicId
        WHERE Comments.CreationDate > CAST('14 SEPTEMBER 2012' as DateTime)
        GROUP BY Users.UserId
        ORDER BY RowCountInGroup DESC) a
    LEFT JOIN [TestDatabase].[dbo].[Users] b ON b.UserId = a.UserId
    

    任何时候你包含一个聚合的列,你必须GROUP BY该列:

    SELECT col1, col2, COUNT(col3)
    FROM table
    GROUP BY col1, col2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 2012-08-01
      相关资源
      最近更新 更多