SQL Server与Oracle在 count() over() 函数的差异

最近一个项目使用了oracle(11g),在编写sql时,要知道数据总条数,可以这么写:

select id,
       v,
	   count(*) over() as num
from 
(
	select 1 as id,'a' v from dual
	union all
	select 2 as id,'b' v from dual
	union all
	select 3 as id,'c' v from dual
	union all
	select 4 as id,'d' v from dual
	union all
	select 1 as id,'e' v from dual
	union all
	select 2 as id,'f' v from dual
	union all
	select 3 as id,'f' v from dual
)tb

sql server的写法差别不大,只要把 from dual去掉就可以了:

select id,
       v,
	   count(*) over() as num
from 
(
	select 1 as id,'a' v 
	union all
	select 2 as id,'b' v 
	union all
	select 3 as id,'c' v 
	union all
	select 4 as id,'d' v 
	union all
	select 1 as id,'e' v
	union all
	select 2 as id,'f' v 
	union all
	select 3 as id,'f' v
)tb

如果我要的是不重复的id字段的个数,oracle可以这么写:

select id,
       v,
	   count(distinct id) over() as num
from 
(
	select 1 as id,'a' v from dual
	union all
	select 2 as id,'b' v from dual
	union all
	select 3 as id,'c' v from dual
	union all
	select 4 as id,'d' v from dual
	union all
	select 1 as id,'e' v from dual
	union all
	select 2 as id,'f' v from dual
	union all
	select 3 as id,'f' v from dual
)tb


而在sql server 2012中写成这样:count(distinct id) over() as num,则会直接报错:

消息 10759,级别 15,状态 1,第 3 行
OVER 子句不允许使用 DISTINCT。
消息 102,级别 15,状态 1,第 19 行
“tb”附近有语法错误。

说明在对count() over()的支持上,sql server还要进一步加强.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值