如何在此查询中获取其他列

时间:2011-11-08 22:09:57

标签: sql

我在查询中使用group by子句。我想通过参数

获取未在组中指定的其他列
SELECT un.user, un.role 
FROM [Unique] un 
group by user, role

在有关[Unique]的查询中共有7列。我如何获得其他列?

5 个答案:

答案 0 :(得分:3)

在大多数数据库中(MySQL和SQLite是我所知的例外),除非以下情况,否则不能在GROUP BY SELECT中包含列:

  1. 该列包含在GROUP BY子句中。

  2. 该列在其中一个受支持的聚合函数中聚合

  3. 在MySQL和SQLite中,从中获取额外值的聚合组内的行是未定义的。

    如果您想在任何其他引擎中添加额外的列,可以将列名称包装在MAX()中:

     SELECT un.user, un.role, MAX(un.city), MAX(un.bday)
     FROM [Unique] un 
     GROUP BY user, role
    

    在这种情况下,额外列的值可能来自输入记录集中的不同行。如果这很重要(有时不是因为额外的列来自一对多JOIN的一侧),你就不能使用这种技术。

    为了清楚起见:如果在SELECT中使用GROUP BY,那么您获取的每一行都是由您正在选择的表中的多行 groups 构成的。如果包含不属于GROUP BY子句的列,则不会向引擎提供有关的任何指令的说明,而这些行是您希望从中读取该值的表。因此,大多数引擎都不允许您运行这种SQL。 MySQL确实有未定义的结果,但我个人认为这样做是不好的做法。

答案 1 :(得分:1)

您必须选择其他列的基础。如果同一用户/角色存在多个条目,您想要第一个/最后一个/随机吗?您必须通过聚合它们或选择将它们包含在group by语句中来对其他列进行选择。

某些RDBMS确实提供了执行此操作的默认行为,但由于问题只是标记为SQL,我们不知道它是否适用。

答案 2 :(得分:0)

您是否尝试过指定它们?

SELECT un.user, un.role, un.col3, un.col4
FROM [Unique] un 
group by user, role

答案 3 :(得分:0)

您需要使用Order By来获取额外的列。或者您最终指定组中的每一列。

答案 4 :(得分:0)

使用LEFT JOIN自我加入Unique,或使用SELECT GROUP BY作为子查询。