【问题标题】:UNION ALL returns a top 1 result incorrect only in SQL Server 2017 [duplicate]UNION ALL 仅在 SQL Server 2017 中返回不正确的前 1 个结果 [重复]
【发布时间】:2018-11-09 00:32:16
【问题描述】:

最近从 SQL Server 2016 升级到 2017 遇到了一个奇怪的错误,我将其缩小为:

select top 1 * from (
    select top 1 id from [user]
    union all
    select 0
) a

现在如果我在 SQL Server 2016 中运行它,我会得到

1

如果我在 2017 年运行它,我会得到

0

如果我将 select top 1 * 更改为 select * 我会得到

1

0

在 SQL Server 2016 和 2017 中...

如果我将查询更新为 order by

select top 1 * from (
    select top 1 id from [user]
    union all
    select 0
) a order by id desc

然后我在 SQL Server 2016 和 2017 中都得到了 1 的正确结果。

这是查询优化器看到'select 0'更快并返回结果吗?

【问题讨论】:

  • 没错,你没有ORDER BY。如果您不提供ORDER BY 子句,则从不保证排序。使用 TOP 1 而不使用 ORDER BY 意味着您很高兴根据优化器的突发奇想从数据集中期待“随机”行。
  • @SebastianBrosch 啊,很好的发现,谢谢。我们从 2005 > 2008 > 2012 > 2014 > 2016 升级,这段代码从未改变,只是在 2017 年坏了。所以我以前从未遇到过这个问题。谢谢。

标签: sql-server sql-server-2017


【解决方案1】:

你试过ORDER BY 1 DESC吗?

应该可以解决两个版本的问题

select top 1 * from (
    select top 1 id from [user]
    union all
    select 0
) a ORDER BY 1 DESC

【讨论】:

  • 我敢肯定,如果您阅读了我的问题,您会注意到我已经提到通过返回正确的结果来添加订单:/
  • 是的,我注意到了,但它是基于列的 (ID),我想知道您不想按特定列排序(例如,如果您有动态 sql)。无论如何,如果这不能回答您的问题,我认为您的主要帖子中的 cmets 会这样做。
  • 代码是在大约 12 年前编写的,因此升级到 SQL Server 的每个版本一直有效,直到上周。只是以前从未见过的奇怪问题。
猜你喜欢
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多