zoukankan      html  css  js  c++  java
  • TOP/ORDER BY 顺序(转)

    问题重现:

    --建表语句,测试数据
    create table TestTable(Id int, Name nvarchar(20),CreateTime datetime)
    go
    declare @Count int = 1
    while(@Count<1000)
    begin
        insert into TestTable
            select @Count,'Name '+CAST(@Count as nvarchar(10)),DATEADD(day,@Count,GETDATE())
        set @Count = @Count+1;
    end
    go
    --建索引
    create clustered index IX_TestTable_CreateTime on TestTable(CreateTime)
    go
    --测试语句
    with c as(
        select top 100 * from TestTable
    )
    select * from c order by CreateTime desc

    语句分析:

    按照字面意思,我们需要先从TestTable上取前100条数据,再把这100条数据按时间倒序显示。可实际结果却是先按CreateTime倒序,然后取后100条数据。也就是说,我们需要的结果是100~1,但是实际结果却是999~900。

    执行计划如下:

    执行计划 

    原因分析:

    其实原因很简单,在Inside Microsoft SQL Server 2005 T-SQL Querying书的第一节已经介绍过了,如下图:

    执行顺序

    可以看到。TOP在SQL 查询中,处在第11位,Order By处在第10位,所以Order by会比Top先执行。这就是为什么上面的语句没有按照我们的意思执行的原因了。

    解决方法:

    with c as(
        select top 100 * from TestTable
    )
    select * from c
    join TestTable as b on c.Id = b.Id
    order by b.CreateTime desc

    如需转载,请注明本文原创自灰太狼的博客:http://blog.csdn.net/tjvictor

  • 相关阅读:
    python线程、线程池
    day10 知识点
    socketserver 进阶之I/O多路复用
    socketserver
    socket
    设计模式
    剑指offer:整数中1出现的次数
    剑指offer:二叉搜索树与双向链表
    剑指offer:扑克牌顺子
    剑指offer:孩子们的游戏(圆圈中最后剩下的数)
  • 原文地址:https://www.cnblogs.com/honkcal/p/2776750.html
Copyright © 2011-2022 走看看