Group By一个不常用的用法
2010-11-04 17:03
246 查看
Group By一个不常用的用法
Flystone 2010-10-29于唐山
乍一看,大家一定认为这有什么好写的呀,不就是group by [item]嘛,对指定列进行分组而已。我在这里说的是一个将被MS删除、不符合ISO语法的用法(大家可以在MS没有删除前显摆显摆嘛,至少2008没有删除)。好,那这是什么语法呢,那就是Group by ALL 。那它和不加ALL有什么差别呢? 差别就是加了ALL后包含所有组和结果集,甚至包含那些其中任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。注意的是指定了 ALL,将对组中不满足搜索条件的汇总列返回空值。
下面还是搞点数据来说明问题吧
---------------------------------------------------------------------
-- Author :flystone
-- Date : 2010-10-29 10:27:56
-- Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
-- Mar 29 2009 10:27:29
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
--
---------------------------------------------------------------------
declare @t table(id int,col char(2))
insert @t select 1,'a'
insert @t select 1,'a'
insert @t select 2,'a'
insert @t select 3,'a'
insert @t select 3,'a'
insert @t select 4,'a'
insert @t select 5,'a'
insert @t select 5,'a'
insert @t select 5,'a'
--1
select id,COUNT(1)
from @t
group by id
--2
select id,COUNT(1)
from @t
where id < 3
group by id
针对上面的数据我们可以得到显而意见的结果 :
/*
id
----------- -----------
1 2
2 1
3 2
4 1
5 3
(5 行受影响)
id
----------- -----------
1 2
2 1
(2 行受影响)
*/
那么如果我们想要得到如下结果呢?
/*
id
----------- -----------
1 2
2 1
3 0
4 0
5 0
*/
显然大家一看就知道我的意思了吧,常规有人一定会union联合、子查询什么的吧,有没有想过其实可以简单点呀,看看下面的语法:
--3
select id,COUNT(1)
from @t
where id < 3
group by all id
结果大家自己运行一下就有答案了。
最后后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,如果以后的项目里有使用的话还是着手修改当前还在使用该功能的应用程序吧。另外还得注意三点:1、CUBE 或 ROLLUP 运算符不能和ALL同时使用。2、如果在访问远程表的查询中还有 WHERE 子句,则该查询不支持 GROUP BY ALL。3、对于具有 FILESTREAM 属性的列,GROUP BY ALL将不被支持。
Flystone 2010-10-29于唐山
乍一看,大家一定认为这有什么好写的呀,不就是group by [item]嘛,对指定列进行分组而已。我在这里说的是一个将被MS删除、不符合ISO语法的用法(大家可以在MS没有删除前显摆显摆嘛,至少2008没有删除)。好,那这是什么语法呢,那就是Group by ALL 。那它和不加ALL有什么差别呢? 差别就是加了ALL后包含所有组和结果集,甚至包含那些其中任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。注意的是指定了 ALL,将对组中不满足搜索条件的汇总列返回空值。
下面还是搞点数据来说明问题吧
---------------------------------------------------------------------
-- Author :flystone
-- Date : 2010-10-29 10:27:56
-- Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
-- Mar 29 2009 10:27:29
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
--
---------------------------------------------------------------------
declare @t table(id int,col char(2))
insert @t select 1,'a'
insert @t select 1,'a'
insert @t select 2,'a'
insert @t select 3,'a'
insert @t select 3,'a'
insert @t select 4,'a'
insert @t select 5,'a'
insert @t select 5,'a'
insert @t select 5,'a'
--1
select id,COUNT(1)
from @t
group by id
--2
select id,COUNT(1)
from @t
where id < 3
group by id
针对上面的数据我们可以得到显而意见的结果 :
/*
id
----------- -----------
1 2
2 1
3 2
4 1
5 3
(5 行受影响)
id
----------- -----------
1 2
2 1
(2 行受影响)
*/
那么如果我们想要得到如下结果呢?
/*
id
----------- -----------
1 2
2 1
3 0
4 0
5 0
*/
显然大家一看就知道我的意思了吧,常规有人一定会union联合、子查询什么的吧,有没有想过其实可以简单点呀,看看下面的语法:
--3
select id,COUNT(1)
from @t
where id < 3
group by all id
结果大家自己运行一下就有答案了。
最后后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,如果以后的项目里有使用的话还是着手修改当前还在使用该功能的应用程序吧。另外还得注意三点:1、CUBE 或 ROLLUP 运算符不能和ALL同时使用。2、如果在访问远程表的查询中还有 WHERE 子句,则该查询不支持 GROUP BY ALL。3、对于具有 FILESTREAM 属性的列,GROUP BY ALL将不被支持。
相关文章推荐
- delegate的一个很常用的用法
- GROUP BY 用法(转载)——group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函
- 通用选择器的一个常用用法
- 通过一个实例介绍 LinkedList 中常用API的用法
- 一个简单的tcl/tk程序,包含了几乎所有常用组件的基本用法,仅供自己参考
- 通过一个实例介绍 ArrayList 中常用API的用法
- 通用选择器的一个常用用法
- tcpdump 一个事例看常用用法
- prototype.js常用函数及其用法
- vim 编辑器常用快捷命令用法
- jquery常用基本用法,让你爱上它!
- Oracle常用几种Sql用法
- python用法: post一个http请求, schedule一个task
- [摘录] 快速掌握一个语言最常用的50%
- C语言中常用库函数及其用法-atol()
- MySQL中distinct及group by的一些用法 分享
- 常用的BAT命令和用法
- 一个for_each用法小例子
- DBUtils 的使用 之 ResultSetHandler的实现 类;ArrayListHandler: 将多条记录封装到一个装有Object[]的List集合中。BeanHandler:(常用)将
- 常用命令,一个合格合法的黑客必知的