在ms sql server中选择不同列时的不同结果

在ms sql server中选择不同列时的不同结果,sql,sql-server,window-functions,Sql,Sql Server,Window Functions,我用heidiSQL查询多个数据库,当我调整SELECT子句时,我得到了不同的结果 当我执行以下查询时,db返回501条记录: select * from klantcontact inner join ( select top 448 ks.FIRNR,ROW_NUMBER() OVER(ORDER BY FIRNR DESC) as rownum from klant ks) res on klantcontact.KLANR = res.FIRNR 我实际上只需要两列。但当我运行以下查

我用heidiSQL查询多个数据库,当我调整SELECT子句时,我得到了不同的结果

当我执行以下查询时,db返回501条记录:

select *
from klantcontact 
inner join (
select top 448 ks.FIRNR,ROW_NUMBER() OVER(ORDER BY FIRNR DESC) as rownum
from klant ks) res
on klantcontact.KLANR = res.FIRNR
我实际上只需要两列。但当我运行以下查询时,我得到了526条记录(仅更改了select子句):


我认为这与“OVER”有关?

在子查询中,您指定了top 448,但没有在末尾指定任何order by子句。因此,每次运行查询时,返回的448行有可能不同,每次给出的行数也不同

将查询更改为以下选项之一:

select klantcontact.NAAM
from klantcontact 
inner join (
select top 448 ks.FIRNR,ROW_NUMBER() OVER(ORDER BY FIRNR DESC) as rownum
from klant ks order by ks.FIRNR) res
on klantcontact.KLANR = res.FIRNR

或者删除top 448子句。

您似乎使用了
top
,而没有使用
ORDER BY
。这实际上意味着您要求SQL Server“从表
klant
中返回448个随机行”。当您使用
TOP
时,请始终包含
orderby
,以确保获得一致的结果。
select klantcontact.NAAM
from klantcontact 
inner join (
select top 448 ks.FIRNR,ROW_NUMBER() OVER(ORDER BY FIRNR DESC) as rownum
from klant ks order by ks.FIRNR) res
on klantcontact.KLANR = res.FIRNR