目前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 ...嗯,这里需要指定 分组里的记录的累加顺序(数值是不关心顺序,字符串就要关心了)