【问题标题】:T-SQL Order By - data type precedence not working as expectedT-SQL 排序依据 - 数据类型优先级未按预期工作
【发布时间】:2018-02-17 08:34:27
【问题描述】:

我已经为这个问题困惑了好几天,并且刚刚确定了我的问题的根源 - order by 子句没有按预期工作。

脚本如下:

select * from my_table
order by change_effective_date, unique_id desc

change_effective_date 是 datetime 字段,unique_id 是 int 字段。

我原以为这会首先给我最近的行(即 change_effective_date 中值最高的行)。但是,它首先给出最旧的行,并且 unique_id 也是按升序排列的(这些 ID 通常是连续的,所以我通常希望它们遵循与日期相同的顺序,尽管这并不完全可靠)。

不解,我求助于谷歌,发现数据类型优先级会影响 order by 子句,将较低级别的数据类型转换为较高级别的数据类型:https://blog.sqlauthority.com/2010/10/08/sql-server-simple-explanation-of-data-type-precedence/

但是,datetime 优先于 int,所以它不应该受到这种方式的影响。

更奇怪的是,如果我从 order by 子句中取出 unique_id,它会完美地按日期降序对数据进行排序。不过,我确实想向 order by 子句添加一个唯一标识符,因为可能有多个行具有相同的日期,并且在脚本中我想识别最新的行(在这种情况下,unique_id 将是领带-breaker,因为我认为它是连续的)。

如果有人能解释这里发生了什么,我将不胜感激!

谢谢。

【问题讨论】:

    标签: sql-server tsql sql-order-by sqldatatypes operator-precedence


    【解决方案1】:
    select * from my_table
    order by change_effective_date desc, unique_id desc
    

    【讨论】:

    • 谢谢!!工作了一个款待。不敢相信我不知道这一点(而且我想知道我过去编写的脚本中还潜伏着哪些其他“排序依据”事故......)。有人知道这是否也适用于 Oracle?
    • 它应该afaik
    • @s.turn 是的。在 Oracle 中也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2021-06-02
    • 2020-10-08
    • 1970-01-01
    相关资源
    最近更新 更多