分组与子查询

时间:2015-01-18 07:54:31

标签: sql sqlite

我想知道是否可以在group by中使用子查询?以sqlite为例,使用这些表:

create table t (foo int, bar int);
insert into t values (100, 100);
insert into t values (200, 200);

然后运行此查询:

select max(bar), foo from t group by (select 1);

返回

max(bar)    foo       
----------  ----------
200         200    

我不确定这意味着什么?看起来像我放在组中的子查询,sqlite仍将返回相同的“答案”。

1 个答案:

答案 0 :(得分:2)

当您使用GROUP BY时,数据库会计算您在GROUP BY中为每行提供的表达式,并为此表达式的每个不同结果创建一个组。

在您的查询中,(select 1)会为所有行生成相同的值,因此所有行都会在同一组中结束。

使用不依赖于表行的表达式是没有意义的。 如果您使用correlated subquery查找其他值,则使用子查询可能会有所帮助:

> create table users(id, name);
> insert into users values (1, 'Tom'), (2, 'Dick'), (3, 'Harry');
> create table admins(userid);
> insert into admins values (1), (3);
> select group_concat(name)
  from user
  group by (select 1
            from admins
            where userid = user.id);
Dick
Tom,Harry

但是,除非您将相同的子查询添加到SELECT子句,否则此类查询的结果不会识别哪个组。