zoukankan      html  css  js  c++  java
  • T-SQL :TOP和OFFSET-FETCH筛选 (五)

    通过were和having条件可以对数据进行筛选,那么如何通过排序对数据进行筛选呢?

    1.TOP筛选

    用于限制查询返回行数或者行数的百分比。

    例如 我们对订单表筛选最近产生的订单5条

    SELECT TOP (5) orderid, orderdate, custid, empid
    FROM Sales.Orders
    ORDER BY orderdate DESC;

    这是通过 排序对数据进行筛选

    前面写过order by子句是在select 子句之后计算的, select又包含disinct选项 ,所以dinsinct 计算顺序大于top 在对数据去重复后再进行top计算

    应该注意的是  一个sql语句出现 top 和order by时 order by 是被计算了两遍   第一次 先对数据进行显示排序  第二次为TOP定义筛选。

    搞不懂一点的是TOP查询返回的是表结果还是游标?, 一般带order by子句的查询返回是一个游标,而不是一个关系结果。

    TOP选项中加入PERCENT关键字 寻找最近产生1%订单

    SELECT TOP (1) PERCENT orderid, orderdate, custid, empid
    FROM Sales.Orders
    ORDER BY orderdate DESC;

    以日期作为排序字段 会出现 多行具有相同的订单日期 每次执行都有不确定性会返回不一样的结果,所有要确保排序字段的唯一性。

    问题来了 如果问题已经存在不能确保唯一性 那如何解决呢? 我们可以加入WITH TLES选项 主要作用返回表中 最后匹配一行所有结果防止因为行同源导致返回数据不一致。

    SELECT TOP (5) WITH TIES orderid, orderdate, custid, empid
    FROM Sales.Orders
    ORDER BY orderdate DESC;

    注意:即使没有排序order by 子句 TOP选项排序也是不明确的,SQL Server 会返回首先物理访问到N 行数据 而不是根据表顺序。

    2.OFFSET-FETCH 筛选

    可以认为加强版 TOP 功能  OFFSET-FETCH 子句被视为order by 子句的一部分   offset 子句 跳过多少行,  fetch 子句显现多少行

    SELECT orderid, orderdate, custid, empid
    FROM Sales.Orders
    ORDER BY orderdate, orderid
    OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;

    以上是跳过50行 显示25行 

    OFFSET-FETCH 子句必须在 orderd by 后面     可以只要有 fethch   但没有fetch 是不行的

    缺点是 不支持PERCENT和WITH TIES  选项 而TOP 支持

    建议 如果只使用筛选行数功能 请使用 OFFSET-FETCH  因为它是标准SQL 而TOP不是 除非需要PERCENT和WITH TIES  选项 仅仅只是筛选行数不建议用TOP

  • 相关阅读:
    Java 将数字转为16进制,然后转为字符串类型 将空格去掉。终结版
    Java 将数字转为16进制,然后转为字符串类型
    Java 数组转字符
    Apple Reject
    NSInternalInconsistencyException
    svn报错cleanup failed–previous operation has not finished; run cleanup if it was interrupted的解决办法
    CSS伪类选择器 奇偶匹配nth-child(even)
    常用css代码(scss mixin)
    织梦网站给栏目添加自定义字段图文详解
    css怎么解决表格边框线重复问题
  • 原文地址:https://www.cnblogs.com/feizianquan/p/9333775.html
Copyright © 2011-2022 走看看