日期:2014-05-17  浏览次数:20501 次

在WITH AS 中同时使用top(@bulltionCount) 和order by 时发现提取的数据缺少
今天在做一个新闻公告读取时,发现一个奇怪的问题,现列出来,咨询大家。功能实现要求传递一个公告条数的参数@bulltionCount,读取当前最新的前bulltionCount条公开公告,发现以下两种sql语句写法读取的数据不一致。

普通写法一,读取数据正常

DECLARE @bulltionCount INT
SET @bulltionCount = 10;

SELECT top (@bulltionCount) Id,Topic,SendTime, SchoolId
FROM Bulltion 
WHERE IsPublic = 1 
ORDER BY tB_Id DESC;


使用WITH AS 和order by tB_Id desc 写法读取数据发现读取的条数不是10条而是4条

WITH PublicBulltionListCTE AS(
        SELECT top (@bulltionCount) Id,Topic,SendTime, SchoolId
        FROM Bulltion 
        WHERE IsPublic = 1 
        ORDER BY Id DESC
    )
    SELECT *
    FROM PublicBulltionListCTE;

有点困惑,以前一直认为这两种方式是等同的,现在提出来咨询大家,谢谢!。


------解决方案--------------------
的确等同,不会出现楼主的情况

楼主检查一下语句是否贴完整,主要看条件是否相同
------解决方案--------------------
一个是
ORDER BY tB_Id DESC
一个是
ORDER BY Id DESC

------解决方案--------------------
看一些执行的计划,执行的语句应该是一样的。
或者后来运行的数据存在修改。
------解决方案--------------------
"使用WITH AS 和order by tB_Id desc 写法读取数据发现读取的条数不是10条而是4条"
多次执行都这样吗?你执行完CTE后,有没有再次执行那个非CTE的语句,它还是返回10行吗?
用可能你在执行CTE的时候数据已经变了,所以这个时候你要立马去查询另外一种方式,看看它是返回4还是10。