目前sql语法尚不支持的多列(元组)in的替换实现、分组取前n名

目前sql语法只支持 f1 in (select fa from b ... )
尚不支持 (f1,f2,f3) in (select fa,fb,fc from b ... )
替换方式为:

left join b

on a.f1=b.fa and a.f2=b.fb and a.f3=b.fc

...

where b.fa is not null and b.fb is not null and b.fc is not null

 

目前sql语法只支持 f1 not in (select fa from b ... )
尚不支持 (f1,f2,f3) not in (select fa,fb,fc from b ... )
替换方式为:

left join b

on a.f1=b.fa and a.f2=b.fb and a.f3=b.fc

...

where b.fa is null and b.fb is null and b.fc is null

 

这是一个很机械的翻译过程,数据库引擎实现自动翻译,应该也不是很困难的事情

 

 

附:

除了top n期待skip m,top n自身也是有细微的需求差别的

1、分组取top n,这个sql2000是不能直接实现的,sql2005开始的ROW_NUMBER() OVER (PARTITION BY 组 ORDER BY 组内排序) 则比较好地解决了

http://blog.csdn.net/fangyuan303687320/archive/2009/09/09/4535353.aspx

2、取前n条记录,如果与第n+1(或更多)条与第n条的值一样,也需要取?

top n with ties !这个是sql2000就支持的,但是以前居然一直没注意到!

3、取前n个值的所有条记录,即top n with level

这个,也是不能直接实现的!

 

 

典型例子:

select top N with ties ... from ... where ... order by ...
取前3名,但是排序的结果是:7,7,6,6,6,5,4,4,3,2,1,1
top 3则得到:7,7,6
top 3 with ties则得到:7,7,6,6,6

top 4则得到:7,7,6,6
top 4 with ties则得到:7,7,6,6,6

其实,我还想要这样的语法top n with level:取按值顺序的前n个,它们所对应的所有记录
top 3则得到:7,7,6
top 3 with ties则得到:7,7,6,6,6
top 3 with ties则得到:7,7,6,6,6,5 (值顺序的前3个是:7,6,5)

top 4则得到:7,7,6,6
top 4 with ties则得到:7,7,6,6,6
top 4 with level则得到:7,7,6,6,6,5,4,4 (值顺序的前3个是:7,6,5,4)

 

 

 

加总 每个班级最高2个分数所对应的人数 ?

 

class班级,score分数

SELECT COUNT(1) FROM TABLESCORE A WHERE (SELECT COUNT(1) FROM TABLESCORE B WHERE B.CLASS=A.CLASS AND B.SCORE>A.SCORE) <2

sql还能这样写。。。。。。。。
最怕这种层次混乱、看似每条记录都要执行一次子程序的sql

不过,用传统的sql2000语法,仅仅是取 每个班级最高2个分数 就很困难了:
select class,top 2 distinct score fs
from TABLESCORE
group by class
order by class,fs desc
——语法好像不支持上面的写法

但是每个班级最高1个分数就很简单:
select class,max(score) fs
from TABLESCORE
group by class

 

 

——还有一个需求:stringsum

现在只有对数值的sum,想对字符类型的字段累加,则没有办法

非分组的,可以:declare @s varchar(8000)

select @s=@s+stringfield3+',' from tb where ... order by ...

但是,想取每个分组的字符串累加,就不行了

所以,最好能提供:stringsum,类型为varchar(max)

select stringsum(stringfield4+',') fs,sum(intfield5) fi from tb

where ... group by ... order by ...嗯,这里需要指定 分组里的记录的累加顺序(数值是不关心顺序,字符串就要关心了)

你可能感兴趣的:(语言特性,数据库)