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