日期:2014-05-18 浏览次数:20538 次
--上下的查询语句是一样的只是将AwardsID判断的值一个是用自定义的变量一个是写死的数值 --为什么查出来的数据就不样 --查询环境一样,同时执行,查询时候未对数据进行任何更改,也没有使用过什么触发器之内的约束 declare @awards_Id int set @awards_Id=1 select top(1) ContestantID,ContestantName,AwardsID,VotesNumber,3 from XYYSJBS_ContestantBYAwardsID_VML where AwardsID=@awards_Id and ContestantID not in(select top(2) ContestantID from XYYSJBS_ContestantBYAwardsID_VML where AwardsID=@awards_Id order by VotesNumber desc) order by VotesNumber desc print '@awards_Id:'+convert(varchar(2),@awards_Id) --result------------- 1 张三 1 3 3 ------------------------------------------------------------------- select top(1) ContestantID,ContestantName,AwardsID,VotesNumber,3 from XYYSJBS_ContestantBYAwardsID_VML where AwardsID=1 and ContestantID not in(select top(2) ContestantID from XYYSJBS_ContestantBYAwardsID_VML where AwardsID=1 order by VotesNumber desc) order by VotesNumber desc --result------------- 5 钱七 1 3 3
select top(1) ContestantID,ContestantName,AwardsID,VotesNumber,3 from XYYSJBS_ContestantBYAwardsID_VML where AwardsID=1 and ContestantID not in(select top(2) ContestantID from XYYSJBS_ContestantBYAwardsID_VML where AwardsID=1 order by VotesNumber desc) order by VotesNumber desc go 10
------解决方案--------------------
楼主把 2段top(1) 去掉,看结果集是不是一样,我估计是排序造成的
------解决方案--------------------
很明显,你的外部查询的top语句没有指定排序字段,所以,每次查询结果就不一样了!
------解决方案--------------------
下面是我猜测的可能会影响的原因:
如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
因为执行计划会保存以备下次使用,所以写死的查询语句会执行这个执行计划。而用参数的却不会。因为执行计划的不同,所以order by 条件的在都是3的情况下会有不同的结果。
如果是上面的原因,解决这个问题只需要在order by语句的VotesNumber 字段后面再加上一个条件比如ContestantID就可以了
------解决方案--------------------
问题出在VotesNumber列,肯定有大量重复值,当然以它排序,结果是随机的!