gpt4 book ai didi

sql - Union 的奇怪 Order By 行为

转载 作者:行者123 更新时间:2023-12-02 09:36:15 25 4
gpt4 key购买 nike

有人可以向我解释一下这里发生了什么吗?该行为并不符合我的预期:

select category,timefield from test where category='A'
union
select top 10 category,timefield from test where category='B' order by timefield desc

我想要的是类别 A 的所有行以及类别 B 中最近的 10 行。
执行时,结果实际上是:类别A的全部(按时间字段降序排序)+类别B的10行(按时间字段降序排序)

更奇怪的是,如果我们将整个语句放入子查询中,我希望行为保持不变并像以前一样进行评估,但事实并非如此:

select * from (
select category,timefield from test where category='A'
union
select top 10 category,timefield from test where category='B' order by timefield desc
) subq

这将返回类别 A 的所有内容(按升序排列)+ 类别 B 中最新的 10 个内容(按降序排列)。这正是我想要的。

为什么第一个语句没有产生我期望的结果,为什么第二个语句的行为截然不同??

(这是 SQL Server 2008)

最佳答案

第一个查询中需要括号,因为 order by 应用于 union 的结果。其解释为:

(select category,timefield from test where category='A'
union
select top 10 category,timefield from test where category='B'
)
order by timefield desc

(我并不是说这是有效的语法。)

而你想要的是:

(select category, timefield from test where category='A')
union
(select top 10 category, timefield from test where category='B' order by timefield desc)

请注意,union 将删除重复项。如果您不希望产生额外的开销,请改用union all

至于为什么它作为子查询起作用,我的猜测是这是一个巧合。当您使用没有 order bytop 时,SQL Server 不会保证返回的结果,甚至保证一次调用与下一次调用的结果是一致的。有时它实际上可能会做你想做的事。

关于sql - Union 的奇怪 Order By 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26000352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com