DataReader.NextResult 检索结果是不是总是相同的顺序

Posted

技术标签:

【中文标题】DataReader.NextResult 检索结果是不是总是相同的顺序【英文标题】:Does DataReader.NextResult retrieves the result is always the same orderDataReader.NextResult 检索结果是否总是相同的顺序 【发布时间】:2009-12-31 13:44:29 【问题描述】:

我有一个 SELECT 查询,它产生多个结果并且没有任何 ORDER BY 子句。 如果我多次执行此查询,然后使用 DataReader.NextResult() 遍历结果,是否可以保证以相同的顺序获得结果?

例如如果我执行以下返回 199 行的查询:

SELECT * FROM products WHERE productid < 200

如果 productid = 1 等,我总是会得到第一个结果吗?

据我观察,它总是以相同的顺序返回结果,但我找不到任何有关此行为的文档。

=======================================

根据我的研究: 查看此博客Conor vs. SQL。我实际上想问即使表中的数据保持不变(即没有更新或删除),查询结果是否也会发生变化。但似乎在大表的情况下,当 SQL Server 员工并行时,顺序可以不同

【问题讨论】:

【参考方案1】:

首先,要迭代DataReader 中的行,您应该调用Read,而不是NextResult。 如果您的查询有多个 SELECT 语句,则调用 NextResult 将移动到下一个结果集。

要回答你的问题,你不能依赖这个。 不带 ORDER BY 子句的查询将按照 SQL Server 的默认迭代顺序返回行。 对于小表,这通常是添加行的顺序,但这不能保证并且随时可能更改。例如,如果表被索引或分区,则顺序会有所不同。

【讨论】:

【参考方案2】:

不,DataReader 将按照它们从 SQL 中返回的顺序返回结果。如果您不指定 ORDER BY 子句,那将是它们在表中存在的顺序。

【讨论】:

我同意罗里的观点。如果您希望它按特定顺序排列,则应在 SQL 语句中添加 Order By。【参考方案3】:

有可能,甚至可能它们总是以相同的顺序返回,但这不能保证。顺序由数据库服务器上的查询计划(至少在 SQL Server 中)确定。如果某些事情改变了查询计划,那么顺序可能会改变。如果结果的顺序对您处理数据很重要,则应始终使用 ORDER BY。

【讨论】:

以上是关于DataReader.NextResult 检索结果是不是总是相同的顺序的主要内容,如果未能解决你的问题,请参考以下文章

mysql必知必会--联 结 表

mysql-7 数据检索

如何拦截CakePHP 3中的检索字段?

红黑树实现伪代码

快速理解平衡二叉树B-treeB+tree

联结表