【问题标题】:SQL Select Statements Changes Implicit OrderingSQL Select 语句更改隐式排序
【发布时间】:2014-12-18 02:52:10
【问题描述】:

今天我刚刚发现,至少我所看到的,是 SQL Server 操作方式中的一个重大缺陷。我的印象是,在没有显式 ORDER BY 子句的情况下执行查询时,SQL 会按 FIFO 隐式排序。自然地,在大多数情况下,这将解决为按 ID 排序(因为通常 ID 是按顺序给出的)。但是今天我在执行这段代码时发现这不是真的

var BadQuery = Model.Titles.Where(t => t.ID > 19632)
                          .Select(i => new { i.ID, i.ExtTitleID })
                          .Take(10).ToList();

//BadQuery Results
//ID: 121148 ExtTitleID: 0001234
//ID: 132638 ExtTitleID: 000263
//ID: 132639 ExtTitleID: 000360
//ID: 132640 ExtTitleID: 000379
//ID: 132641 ExtTitleID: 000387
//ID: 132642 ExtTitleID: 000409
//ID: 132643 ExtTitleID: 000417
//ID: 134246 ExtTitleID: 000514
//ID: 132644 ExtTitleID: 000522
//ID: 132645 ExtTitleID: 000530

var GoodQuery = Model.Titles.Where(t => t.ID > 19632)
                            .Take(10).ToList()
                            .Select(i => new { i.ID, i.ExtTitleID }).ToList();

//GoodQuery Results
//ID: 19633 ExtTitleID: 30706
//ID: 19634 ExtTitleID: 30708
//ID: 19635 ExtTitleID: 30709
//ID: 19636 ExtTitleID: 3071
//ID: 19637 ExtTitleID: 30710
//ID: 19638 ExtTitleID: 30711
//ID: 19639 ExtTitleID: 30712
//ID: 19640 ExtTitleID: 30714
//ID: 19641 ExtTitleID: 30719
//ID: 19642 ExtTitleID: 3072

错误查询由 ExtTitleID 排序,ExtTitleID 是数据库中的一个 varchar。这不是我所期望的。而 Good Query 按 ID 或 FIFO 顺序排列。

如果我之前在查询中添加选择语句,似乎只能按 ExtTitleID 排序。选择之前的 Good Query ToList 意味着选择发生在 Linq to Object (c#) 而不是 LinqToEntities(SQL)

我的问题是 SQL 如何确定顺序的规范是什么? 另外,这种异常是否意味着我必须重构并明确订购查询中包含 select 语句的任何内容?

【问题讨论】:

  • 如果您希望结果集以某种方式排序,请使用ORDER BY。见this question
  • 根据 SQL 规范,行中没有顺序。你错了。
  • 哎呀,我想这就是我不应该依赖归纳推理的原因。好吧,现在我必须重构我曾经做过的每一个 Linq 调用......经验教训。

标签: c# sql linq tsql sorting


【解决方案1】:

没有ORDER BY 子句,SQL 指定没有关于结果行的顺序。在实践中,这种情况下的顺序取决于许多因素,包括数据结构(包括索引)、查询和数据的细节以及 DBMS 的实现。

如果您希望以特定顺序显示结果行,请使用适当的ORDER BY 子句。

【讨论】:

    【解决方案2】:

    http://msdn.microsoft.com/en-gb/library/ms188385.aspx

    “除非指定了 ORDER BY 子句,否则无法保证结果集中返回行的顺序。”

    因此没有默认的 ORDER BY - 如果您希望结果的顺序是可预测的,那么您需要指定 order by 子句。

    【讨论】:

    • 好的,另一个类似的问题。如果我在单个属性上调用 Select 是否意味着我的结果集仍然没有排序?
    • 正如MSDN文章所说,不能保证顺序。例如,在实践中,如果将索引添加到表中,它可能会发生变化。如果您需要订购,则必须订购。
    猜你喜欢
    • 1970-01-01
    • 2015-07-24
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2011-01-15
    • 2014-09-16
    • 1970-01-01
    相关资源
    最近更新 更多