IBM AS400 iSeries - select 语句的排序顺序

IBM AS400 iSeries - sort order of select statement

我们有一个供应商为我们公司管理 AS400。他们的一项服务是通过 table 提供文件,我可以使用 iSeries 查询这些文件。但是,table 只有一列,每条记录只是其中一个文件的一行。因此,我需要 select 来自 table 的所有记录,同时保持它们的输入顺序,但我没有可以在其上使用 ORDER BY 的列。

据我了解,在关系数据库中,没有 ORDER BY 子句的 select 语句无法保证排序顺序。 AS400 / iSeries 系统的操作方式是否相同?从我所做的阅读来看,它似乎是一种不同类型的 DBMS,但我没有找到任何东西告诉我 select 是否会潜在地改变/不改变插入记录的顺序进入table。 "appears" 每当我 运行 一个 select 时,我总能得到看起来正确的排序顺序,但如果可以的话,我想保证它。

提前感谢您的任何建议和帮助。

如果没有明确的 ORDER BY 子句,记录可以按 SQL 优化器认为最有效的任何顺序返回。

DB2/400有"relative record number"的概念。新记录总是附加到 table 除非 table 上的 "Reuse deleted records" 设置为 *YES

您可以使用 RRN 函数按记录在文件中的物理顺序对记录进行排序:

SELECT * FROM TABLENAME ORDER BY RRN(TABLENAME)

添加子句order by RRN(mytable) 这将按照 FIFO 顺序获取记录。但这取决于供应商如何加载 table。不要相信它总有一天会失败。它将与本机 as400 tables.

一起使用

考虑在您的 select 语句中添加一个 order by 子句以满足您的需要。

这永远有效。如果您需要按邮政编码排序的记录,则按邮政编码排序。如果您需要按名称顺序排列的记录,则按 "name" 排序。除非您指定 order by 子句,否则无法保证记录的顺序。

你的问题。是的,当 select 中没有 order by 子句时,select 可以使用 select 更改 DB2 (as400) 中的 order by。 Db2 尝试使用索引来更快地呈现结果。

例如

select * from customer when cust_name like 'Dan%'

cust_name 有一个关于客户的索引。

结果可能会按 cust_name 排序。取决于其他因素,但理论上没有 order by 子句的 select 可以按任何顺序出现,但很可能是 table 或 table 上的索引序列主键。