0

我们有一个为我们公司管理 AS400 的供应商。他们的一项服务是通过我可以使用 iSeries 查询的表提供文件。但是,该表只有一列,每条记录只是其中一个文件的一行。所以我需要从表中选择所有记录,同时保持它们的输入顺序,但是我没有可以使用 ORDER BY 的列。

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

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

4

2 回答 2

3

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

DB2/400 有“相对记录号”的概念。除非表上的“重用已删除记录”设置为 ,否则新记录始终附加到表中*YES

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

SELECT * FROM TABLENAME ORDER BY RRN(TABLENAME)
于 2017-03-06T22:51:29.567 回答
-2

通过 RRN(mytable)添加一个子句顺序,这将获得 FIFO 序列中的记录。但这取决于供应商如何加载表。不要相信它总有一天会失败。它将与本机 as400 表一起使用。

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

这永远有效。如果您需要按邮政编码顺序的记录,请按邮政编码订购。如果您需要按名称顺序记录,请按“名称”排序。除非您指定 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 可以按任何顺序出现,但很可能是表或表主键上的索引序列。

于 2017-03-06T23:06:20.053 回答