SELECT TOP 100 *
FROM (SELECT TOP 100 *
        FROM 持卡人表
        WHERE 卡号>'1800000455'
and 发卡日期 IN
                  (SELECT TOP 1000 发卡日期
                 FROM 持卡人表
where 卡号>'1800000455'
                 ORDER BY 地区代理号)
        ORDER BY 发卡日期 DESC) tmp
ORDER BY 发卡日期

解决方案 »

  1.   

    SELECT TOP 100 *
    FROM (SELECT TOP 100 *
            FROM 持卡人表
            WHERE 发卡日期 IN
                      (SELECT TOP 1000 发卡日期
                     FROM 持卡人表 
    where 
    卡号>'1800000455' 
                     ORDER BY 地区代理号)
            ORDER BY 发卡日期 DESC) tmp
    ORDER BY 发卡日期
      

  2.   

    TOP 子句限制返回到结果集中的行数。TOP n [PERCENT]n 指定返回的行数。如果未指定 PERCENT,n 就是返回的行数。如果指定了 PERCENT,n 就是返回的结果集行的百分比,如下所示:TOP 120 /*Return the top 120 rows of the result set. */
    TOP 15 PERCENT /* Return the top 15% of the result set. */.如果一个 SELECT 语句既包含 TOP 又包含 ORDER BY 子句,那么返回的行将会从排序后的结果集中选择。整个结果集按照指定的顺序建立并且返回排好序的结果集的前 n 行。
    SELECT TOP 100 *
    FROM (SELECT TOP 100 *
            FROM 持卡人表
            WHERE 发卡日期 IN
                      (SELECT TOP 1000 发卡日期
                     FROM 持卡人表 where 卡号>'1800000455' 
                     ORDER BY 地区代理号)
            ORDER BY 发卡日期 DESC) tmp
    ORDER BY 发卡日期
      

  3.   

    先安地区代理号排序(默认升序)然后取出前1000个的发卡日期
    然后把结果按发卡日期排序(降序)然后取出前100个的所有信息然后再按发卡日期排序你说的卡号>'1800000455' 的条件要看你是在哪个条件下加?
    如果是在取出前1000个的时候加就是
    SELECT TOP 100 *
    FROM (SELECT TOP 100 *
            FROM 持卡人表
            WHERE  发卡日期 IN
                      (SELECT TOP 1000 发卡日期
                     FROM 持卡人表
    where 卡号>'1800000455'
                     ORDER BY 地区代理号)
            ORDER BY 发卡日期 DESC) tmp
    ORDER BY 发卡日期如果是取出100个后加这个条件就是
    SELECT TOP 100 *
    FROM (SELECT TOP 100 *
            FROM 持卡人表
            WHERE 卡号>'1800000455'
    and 发卡日期 IN
                      (SELECT TOP 1000 发卡日期
                     FROM 持卡人表  ORDER BY 地区代理号)
            ORDER BY 发卡日期 DESC) tmp
    ORDER BY 发卡日期
      

  4.   

    SELECT TOP 100 *
    FROM (SELECT TOP 100 *
            FROM 持卡人表
            WHERE 发卡日期 IN
                      (SELECT TOP 1000 发卡日期
                     FROM 持卡人表
                     ORDER BY 地区代理号)
            ORDER BY 发卡日期 DESC) tmp
    ORDER BY 发卡日期
    --这句的作用可以这样理解(分解语句来执行)--1.首先执行:
    SELECT TOP 1000 发卡日期 FROM 持卡人表 ORDER BY 地区代理号使用:
    从 [持卡人表] 得到一个按 [地区代理号] 从大到小的 1000 个 [发卡日期]我们把它存放一个临时表 #t 中SELECT TOP 1000 发卡日期 into #t FROM 持卡人表 ORDER BY 地区代理号
    --2.接着执行
    SELECT TOP 100 * FROM 持卡人表
    WHERE 发卡日期 IN 
    (SELECT TOP 1000 发卡日期
        FROM 持卡人表
        ORDER BY 地区代理号)
    ORDER BY 发卡日期 DESC--把刚才的临时表带进去
    SELECT TOP 100 * FROM 持卡人表
    WHERE 发卡日期 IN (select 发卡日期 from #t)
    ORDER BY 发卡日期 DESC作用就是取 [发卡日期] 最近的100条记录
    并且满足条件: [发卡日期] 在第一次查询的结果中我们把结果放入临时表 #t1 中SELECT TOP 100 * into #t1 FROM 持卡人表
    WHERE 发卡日期 IN (select 发卡日期 from #t)
    ORDER BY 发卡日期 DESC
    --3.再执行
    SELECT TOP 100 *
    FROM (SELECT TOP 100 *
            FROM 持卡人表
            WHERE 发卡日期 IN
                      (SELECT TOP 1000 发卡日期
                     FROM 持卡人表
                     ORDER BY 地区代理号)
            ORDER BY 发卡日期 DESC) tmp
    ORDER BY 发卡日期--带入临时表
    SELECT TOP 100 * 
    FROM #t1 
    ORDER BY 发卡日期这个作用就很明白了,在第二次查询结果的基础上,把记录顺序调整为按 [发卡日期] 升序
      

  5.   

    从语法上讲,条件语句加到任意一层里都可以,但实现的目的肯定不一样:
        如果加到最内层里,则查处发卡日期符合条件并且卡号>'1800000455' 的记录,然后在此记录中选择前地区代理号靠前的100条;
        如果加到第二层里,则是在子查询返回的1000条记录中筛选卡号>'1800000455' 的发卡日期靠后的100条记录。
        如果加到最外层,则是取发卡日期靠前的100条记录。
      

  6.   

    先安地区代理号排序(默认升序)取出前1000个的发卡日期
    然后把结果按发卡日期排序(降序)取出前100个的所有信息
    然后再按发卡日期排序(降序)取出前100个的所有信息条件语句加到任意一层里都可以,但实现的目的和得到的结果肯定不一样:
        如果加到最内层里,则查处发卡日期符合条件并且卡号>'1800000455' 的记录,然后在此记录中选择前地区代理号靠前的100条;
        如果加到第二层里,则是在子查询返回的1000条记录中筛选卡号>'1800000455' 的发卡日期靠后的100条记录。
        如果加到最外层,则是取发卡日期靠前的100条且卡号>'1800000455' 记录。