【问题标题】:Query against subquery yields different results than running subquery alone针对子查询的查询产生的结果与单独运行子查询不同
【发布时间】:2023-03-09 04:20:01
【问题描述】:

我有一个使用子查询对数据进行子集化的查询,然后我尝试从子查询中选择特定数据。子查询是:

select top 10 Build_ID, Appscan_Definitive_High,
rank() over (order by Appscan_Definitive_High desc) as rankpct
from 
(
select build_id, convert(int,appscan_definitive_high) as
           appscan_definitive_high
from dbo.SDFBuildMetrics
where coalesce(appscan_definitive_high,0)>0
) a 

结果如下:

Build_ID    Appscan_Definitive_High rankpct
31966   51  1
32627   51  1
44293   51  1
47011   51  1
47968   51  1
48554   51  1
25586   49  7
27370   49  7
40357   48  9
23867   44  10

但是当我对子查询运行查询时:

select Appscan_Definitive_High
from
(
select top 10 Build_ID, Appscan_Definitive_High,
    rank() over (order by Appscan_Definitive_High desc) as rankpct
from 
(
    select build_id, convert(int,appscan_definitive_high) as
                appscan_definitive_high
    from dbo.SDFBuildMetrics
    where coalesce(appscan_definitive_high,0)>0
) a 
 ) aa

我明白了:

Appscan_Definitive_High
1
44
21
44
2
44
2
6
7
7

完整查询的最终目的是检索 min(AppScan_Definitive_High) 但由于返回的值集与从子查询返回的值集不匹配,因此 min 函数不能满足我的需要。我假设子查询返回一组外部查询对其进行操作的数据,但在上面的示例中似乎并非如此。

有什么帮助吗?

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    您正在运行选择前 10 名,但没有排序依据。为了得到你想要的结果,你需要在那里订购。

    【讨论】:

    • 嗯。 a)我认为您不能在子查询中指定 order by 和 b)我不确定我是否理解为什么这很重要。如果子查询返回一组数据,如第一个示例所示,那么外部查询操作的是什么?它有效,但我不完全确定为什么......
    • 您可以(并且可能应该)始终使用 top 指定 order by。如果您不这样做,SQL Server 可以跳过某些事情,或者例如并行性会导致不同类型的结果。实际的执行计划可能会揭示发生这种情况的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2021-11-19
    相关资源
    最近更新 更多