在sql查询中,取前N项几乎是最为入门的操作了,怎么这里也有坑吗?
当然有的哦!
一个最简单的场景,我们企图在一个学生成绩表中查询前三名。语句应该类似于:
// SQL server:
Select top 3 * from 成绩表 order by 成绩 desc
// MySQL、PGSql:
SELECT * FROM 成绩表 order by 成绩 desc LIMIT 3
上面的查询,将会得到3条记录(假设记录数大于3条)。
但是:有没有想到有这样一种场景:有5个人并列第三名了,语句的执行结果还符合预期吗?
这时,我们需要使用SQL:2008标准里引入的关键字“WITH TIES”了。它将会带来“并列第三名”的查询效果——当然,出于可以理解的原因,这个关键字必须和order by联合使用。同时,需要注意在不同的数据库上,对标准的实现是各不相同的。
如Sql server 的实现,看起来就比较简练,毕竟少了Fetch关键词嘛!
Select top 3 with ties * from 成绩表 order by 成绩 desc
而PgSQL (13及更高)看起来就比较冗长。留意limit关键字已经被直接替换了
SELECT * FROM 成绩表 order by 成绩 desc fetch fi