Sql server SQL Server—试图找出为什么从CTE选择与从临时表选择时会得到不同的结果集

Sql server SQL Server—试图找出为什么从CTE选择与从临时表选择时会得到不同的结果集,sql-server,Sql Server,我一直在努力更新SQLServer中的标量函数。原始功能利用CTE选择初始数据,然后进行操作以获得所需的结果。为了解决正在发生的错误,我将一些CTE转换为临时表,以便我可以选择并查看每个步骤中的数据。不过我注意到,我会得到一个不同的结果集,而不是像最初设置的那样运行函数 cte_filterDuplicates/@cte_filterDuplicates-这是我从中选择的cte/temp表 category|resultvalue Blood Type|Abnormal Blood Type

我一直在努力更新SQLServer中的标量函数。原始功能利用CTE选择初始数据,然后进行操作以获得所需的结果。为了解决正在发生的错误,我将一些CTE转换为临时表,以便我可以选择并查看每个步骤中的数据。不过我注意到,我会得到一个不同的结果集,而不是像最初设置的那样运行函数

cte_filterDuplicates/@cte_filterDuplicates-这是我从中选择的cte/temp表

  category|resultvalue
Blood Type|Abnormal
Blood Type|B
Blood Type|IMM
Blood Type|Neg
Blood Type|NL
Blood Type|NR
 Rh Factor|Pos
然后我从中选择另一个CTE

,cte_format
as
(
    select
        (select top(1) resultvalue from cte_filterDuplicates as fd where fd.category = 'Blood Type') as bloodtype,
        (select top(1) resultvalue from cte_filterDuplicates as fd where fd.category = 'Rh Factor') as rh
)
然后我从cte_格式中选择*以查看我得到了什么

将这些表格制作为CTE时,我的结果集是:

bloodtype|rh
      Neg|Pos
但是,当我在这两个都是临时表的情况下执行此操作时,我的结果集不同:

bloodtype|rh
 Abnormal|Pos

第二个结果集是我所期望的结果,但他们没有

除非指定
orderby
,否则数据是无序的。是的,@JacobH是正确的。只要您不显式使用
orderby
(选择TOP(1))子查询可以而且显然将返回任何记录,无论引擎在当前情况下更喜欢什么。我认为
(选择TOP(1)…)
将消除对orderby的需要,因为我只选择了一行。我很高兴我删除了函数的这一部分。如果您希望获得有序结果,只需将
orderby
top
一起使用即可。否则,您不能保证当发动机返回第一行时会出现
异常
。在函数中使用临时表可能不是一个好选择。@JacobH我明白你的意思,这是有道理的。谢谢