SQL SERVER (MSSQL) 如何实现 MySQL 等数
SQL SERVER 本身是没有提供 Limit 这个功能词的。
网络上很多文章都是用 TOP 实现此功能,但是本人完全不推荐大家使用 TOP 来限定。原因有很多,比如:复杂度太高,需要在查询语句前后增加新的语句,使用查询语句长度远远高于其它数据库的语句长度;语法兼容性不好,与其它数据库放置在末尾的形式相比,非常丑陋难用;功能一级残废,在一些复杂的查询中,很难构造出多层级的Limit效果(如 Union),极易报错。
推荐大家使用:Order + Offset + Fetch 的方式实现。
优点是,构造比TOP更简单易用,语法与其它数据库的类似,直接加在末尾即可。缺点是,必须同时使用(非子句可只使用Order),并不像其它数据库那样缺省也能正常查询那样方便。
举个简单的例子:
SELECT netarm_name,netarm_price FROM dbo.netarm ORDER BY netarm_price,netarm_name OFFSET 5 ROWS FETCH NEXT 8 ROWS ONLY;
此处的5和8就是 Limit 的值。
给一个Union的示例:
select * from (select id,userid from dbo.netarm_user where id>20 order by id desc offset 0 rows fetch next 5 rows only) T1 union select * from (select id,userid from dbo.netarm_user where id<10 order by id asc offset 0 rows fetch next 5 rows only) T2 order by id desc offset 0 rows fetch next 10 rows only;
注意,子句中的 order 和 offset fetch 不能单独使用。如果此处使用TOP来实现,主句的 Limit 效果基本上是实现不了的,只能在程序代码中再截取一次。
更多相关用法可自行搜索。