2017-03-06 54 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