在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。