2017-03-06 104 views
0

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

我理解在关系数据库中,在没有ORDER BY子句的select语句上没有保证的排序顺序。 AS400/iSeries系统的操作方式是否相同?从我已经完成的阅读中,它似乎是一种不同的DBMS,但是我没有找到任何能够告诉我选择是否可能改变/不改变记录插入到表中的顺序的东西。它“出现”,每当我运行一个选择,我总是得到似乎是正确的排序顺序,但我想保证它,如果我可以。

非常感谢您的任何建议和帮助。

+0

如果您正在使用SQL,那么包含'ORDER BY'的问题是什么?如果只是为了确保您将来没有意外的错误? –

+0

只有1列,并且该列中的数据没有任何逻辑方式进行排序。所以我没有什么可以使用ORDER BY。它作为一个文本文件进入我们的供应商,我们的供应商将它按照与文件中的行相同的顺序插入到表中,但是它们自己没有数字或任何可以排序的数字。 – Mike

+0

是否所有通过SQL SELECT的查询?如果只是单列表格,是否有理由“查询”而不是简单地阅读内容? – user2338816

回答

3

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

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

可以使用RRN功能通过它们的物理顺序文件中的命令记录:

SELECT * FROM TABLENAME ORDER BY RRN(TABLENAME) 
+0

这解决了我的问题。非常感谢您的帮助! – Mike

-2

通过RRN(MYTABLE)添加一个条款为了这将让在FIFO顺序记录。但这取决于供应商如何加载表格。不要相信它有一天会失败。它将与本地as400表一起工作。

考虑在您的select语句中添加一个order by子句以适合您的需求。

这会永远有效。如果您需要邮政编码顺序的记录,然后通过邮政编码进行订购。如果您需要名称顺序的记录,则按“名称”排序。除非您指定了按顺序的条款,否则对记录顺序没有任何保证。

您的问题。是的,select可以在select(select)中没有order by子句的情况下用select(select)在DB2中更改order(as400)。 Db2尝试使用索引更快地呈现结果。

例如

select * from customer when cust_name like 'Dan%' 

而且还有由CUST_NAME指数超过顾客。

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

+0

因为OP考虑了“考虑增加一个订单的条款”,因为OP之前已经解释了为什么在这种情况下这不是一个可能性,无论是在问题还是评论中。 – jmarkmurphy

+0

有些人一味追随。有些不。 – danny117